谢Achen提醒,差点忘了有计算几何这东西。
poj2187 平面最远点对,凸包+旋转卡壳模板
//Serene #include<algorithm> #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<cmath> using namespace std; #define ll long long #define For(i,a,b) for(int i=(a);i<=(b);++i) #define Rep(i,a,b) for(int i=(a);i>=(b);--i) const int maxn=5e4+7; int n; char cc; ll ff; template<typename T>void read(T& aa) { aa=0;cc=getchar();ff=1; while((cc<‘0‘||cc>‘9‘)&&cc!=‘-‘) cc=getchar(); if(cc==‘-‘) ff=-1,cc=getchar(); while(cc>=‘0‘&&cc<=‘9‘) aa=aa*10+cc-‘0‘,cc=getchar(); aa*=ff; } const double eps=1e-10; double pf(double x){return x*x;} inline int dcmp(const long double &x){return abs(x)<eps? 0:(x>0? 1:-1);} struct Xl{ double x,y; Xl(double x=0.,double y=0.):x(x),y(y){} bool operator == (const Xl &b) const{return (!dcmp(x-b.x))&&(!dcmp(y-b.y));} bool operator < (const Xl &b) const{return !dcmp(x-b.x)? y<b.y:x<b.x;} Xl operator + (const Xl &b) const{return Xl(x+b.x,y+b.y);} Xl operator - (const Xl &b) const{return Xl(x-b.x,y-b.y);} Xl operator * (const double &b) const{return Xl(x*b,y*b);} Xl operator / (const double &b) const{return Xl(x/b,y/b);} double len() const{return pf(x)+pf(y);} }node[maxn],zz[maxn]; int t; double D_(const Xl& a,const Xl& b){return a.x*b.x+a.y*b.y;} double X_(const Xl& a,const Xl& b){return a.x*b.y-a.y*b.x;} bool cmp(const Xl& a,const Xl& b){ return dcmp(X_(a-node[1],b-node[1]))==0? (a-node[1]).len()<(b-node[1]).len() : dcmp(X_(a-node[1],b-node[1]))>0; } void graham() { For(i,2,n) if(node[i]<node[1]) swap(node[i],node[1]); sort(node+2,node+n+1,cmp); zz[++t]=node[1]; zz[++t]=node[2]; For(i,3,n) { while(t>1&&dcmp(X_(zz[t]-zz[t-1],node[i]-zz[t]))<=0) --t;// "<" -> WA zz[++t]=node[i]; } } double RC() { zz[t+1]=zz[1]; int now=2;double rs=0; For(i,1,t) { while(X_(zz[i+1]-zz[i],zz[now]-zz[i])<X_(zz[i+1]-zz[i],zz[now+1]-zz[i])) if((++now)>t) now=1; rs=max(rs,(zz[now]-zz[i]).len()); } return rs; } int main() { read(n); For(i,1,n) { read(node[i].x); read(node[i].y); } graham(); printf("%lld",(ll)RC()); return 0; } /* 4 0 0 0 1 1 3 1 0 */