感覺是6題中最難的一題,其實這題是乙個二合一:
第一問:給定平面上若干點和k個關鍵點,關鍵點覆蓋乙個45°傾斜的正方形範圍r,求有多少點被至少乙個關鍵點覆蓋。這個可以曼哈頓轉切比雪夫距離,然後再掃瞄線求解,複雜度o(nlogn)
第二問:求最少和最多有多少次擦肩而過。顯然每個交點都可以做對向交換,這是最少擦肩而過的次數。最多的次數,假設全部擦肩而過得到排列p,對向交換實際上是交換兩元素位置,用最小交換次數還原排列即可。
#includeusingview codenamespace
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);
}
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次,不如只做頭尾兩次更好。所以把...