1. 程式人生 > >BZOJ 5099: Pionek(雙指針)(占位)

BZOJ 5099: Pionek(雙指針)(占位)

turn pac std angle 證明 ++ 雙指針 name max

pro:有N個向量,你可以選擇一些向量,使得其向量和離原點最遠。 輸出這個歐幾裏得距離的平方。

sol:(感覺網上的證明都不是很充分,我自己也是半信半疑吧)日後證明了再補。

#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=400010;
const double pi=acos(-1.0);
struct point{
    int x,y;
    double angle;
};
bool cmp(point w,point v){ return w.angle<v.angle; } point a[maxn]; ll ans,x,y; void update(){ ans=max(ans,1LL*x*x+y*y); } int main() { int N,head=0; scanf("%d",&N); rep(i,1,N){ scanf("%d%d",&a[i].x,&a[i].y); a[i].angle=atan2(a[i].y,a[i].x); } sort(a
+1,a+N+1,cmp); rep(i,1,N){ a[i+N]=a[i]; a[i+N].angle=a[i].angle+pi*2; } rep(i,1,N){ x-=a[i-1].x; y-=a[i-1].y; update(); while(head+1-i+1<=N&&head+1<=N+N&&a[head+1].angle-a[i].angle<=pi){ head++; x+=a[head].x; y+=a[head].y; update(); } } printf(
"%lld\n",ans); return 0; }

BZOJ 5099: Pionek(雙指針)(占位)