GX GZOI2019 特技飛行(掃瞄線 置換)

2022-05-05 12:45:13 字數 1474 閱讀 4459

感覺是6題中最難的一題,其實這題是乙個二合一:

第一問:給定平面上若干點和k個關鍵點,關鍵點覆蓋乙個45°傾斜的正方形範圍r,求有多少點被至少乙個關鍵點覆蓋。這個可以曼哈頓轉切比雪夫距離,然後再掃瞄線求解,複雜度o(nlogn)

第二問:求最少和最多有多少次擦肩而過。顯然每個交點都可以做對向交換,這是最少擦肩而過的次數。最多的次數,假設全部擦肩而過得到排列p,對向交換實際上是交換兩元素位置,用最小交換次數還原排列即可。

#includeusing

namespace

std;

typedef pair

pii;

const

int n=5e5+7

;int n,m,a,b,c,x0,x1,ans1,ans2,tot,cnt,ans,c[n<<1],y[n][2

],f[n],vis[n];

double d[n<<1

];set

s;struct nodep[n<<1

];bool

operator

node calc(

int i,intj);

}bool cmp(node a,node b)

void add(int x,int v)

int query(int x)

bool cmp1(int a,int b)

intmain()

int sum=tot;scanf("

%d",&m);

for(int i=1,x,y,z;i<=m;i++)

;p[++tot]=(node);

p[++tot]=(node);

p[++tot]=(node);

}sort(p+1,p+tot+1

); sort(d+1,d+cnt+1

); cnt=unique(d+1,d+cnt+1)-d-1

;

for(int i=1;i<=tot;i++)p[i].p=upper_bound(d+1,d+cnt+1,p[i].y-1e-10)-d;

sort(p+1,p+tot+1

,cmp);

for(int i=1;i<=tot;i++)if(p[i].v)add(p[i].p,p[i].v);else ans+=query(p[i].p)>0

; ans1=ans*c+sum*a;

for(int i=1;i<=n;i++)f[i]=i;

sort(f+1,f+n+1

,cmp1);

int num=n;

for(int i=1;i<=n;i++)

if(!vis[i])

ans2=ans1+(b-a)*(sum-num);

if(ans1>ans2)swap(ans1,ans2);

printf(

"%d %d

",ans1,ans2);

}

view code

2697 特技飛行

題目鏈結 題目大意 n個單位時間,每個單位時間可以進行一項特技動作,每個特技動作有權值ci,定義某次動作的價值為 距上次該動作的時間 ci,若為第一次進行該動作,價值為0,最大化總收益 題解 顯然每個動作只能做兩次 做一次無收益,大於兩次浪費 那麼直接貪心,把權大的放在兩邊 我的收穫 2333333...

bzoj 2697 特技飛行

神犇航空開展了一項載客特技飛行業務。每次飛行長n個單位時間,每個單位時間可以進行一項特技動作,可選的動作有k種,每種動作有乙個刺激程度ci。如果連續進行相同的動作,乘客會感到厭倦,所以定義某次動作的價值為 距上次該動作的時間 ci,若為第一次進行該動作,價值為0。安排一種方案,使得總價值最大。第一行...

bzoj2697特技飛行

bzoj2697特技飛行 題意 n個單位時間,每個單位時間可以進行一項特技動作,可選的動作有k種,每種動作有乙個刺激程度ci。每次動作的價值為 距上次該動作的時間 ci,若為第一次進行該動作,價值為0。求最大總價值。n 1000,k 300。題解 因為如果同個動作做3次,不如只做頭尾兩次更好。所以把...