#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const int N=60005; inline int dcmp(int x){ if(!x)return 0; return x>0?1:-1; } struct pt{ int x,y; }p[N],ans[N]; int top,n; int s[N]; inline int dis(pt a,pt b){ return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y); } inline int cross(pt a,pt b,pt c){ return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x); } bool cmp(pt a,pt b){ int ans=cross(p[0],a,b); if(ans >0 || (!ans && dis(p[0],a)>dis(p[0],b)))return true; return false; } void graham(){ s[0]=0;s[1]=1;top=1; for(int i=2;i!=n;i++){ while(top && cross(p[s[top-1]],p[s[top]],p[i])<0)top--; s[++top]=i; } top++; } inline int rotating_calipers(){ int q=1;s[top]=s[0];q=1; int ans=dis(p[s[0]],p[s[1]]); for(int i=0;i<top;i++){ while(abs(cross(p[s[i+1]],p[s[i]],p[s[q+1]]))>abs(cross(p[s[i+1]],p[s[i]],p[s[q]]))) q=(q+1)%top; ans=max(ans,max(dis(p[s[i]],p[s[q]]),dis(p[s[(i+1)%top]],p[s[q]]))); } return ans; } int main(){ int i,x=0; x=0; memset(s,0,sizeof(s)); cin>>n; for(i=0;i<n;i++){ scanf("%d%d",&p[i].x,&p[i].y); if(p[x].y>p[i].y || (p[x].y == p[i].y && p[x].x>p[i].x))x=i; }if(x) swap(p[0],p[x]); sort(p+1,p+n,cmp); graham(); cout<<rotating_calipers()<<endl; return 0; }
poj2187Beauty Contest 凸包最大距离
最新推荐文章于 2019-08-20 18:29:00 发布