暴力过了
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<cassert> #include<iomanip> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 #pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; const double g=10.0,eps=1e-7; const int N=50000+10,maxn=500+100,inf=0x3f3f3f; struct point{ double x,y; }; point p[N],s[N]; int n; double dir(point p1,point p2,point p3) { return (p3.x-p1.x)*(p2.y-p1.y)-(p3.y-p1.y)*(p2.x-p1.x); } double dis(point p1,point p2) { return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)); } double powdis(point p1,point p2) { return (p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y); } bool comp(point p1,point p2) { double te=dir(p[0],p1,p2); if(te<0)return 1; if(te==0&&dis(p[0],p1)<dis(p[0],p2))return 1; return 0; } double Graham() { int pos; double minx,miny; minx=miny=inf; for(int i=0;i<n;i++) { if(p[i].x<minx||(p[i].x==minx&&p[i].y<miny)) { minx=p[i].x; miny=p[i].y; pos=i; } } swap(p[0],p[pos]); sort(p+1,p+n,comp); int top=2; p[n]=p[0]; s[0]=p[0],s[1]=p[1],s[2]=p[2]; for(int i=3;i<=n;i++) { while(top>=2&&dir(s[top-1],s[top],p[i])>0)top--; s[++top]=p[i]; } /* for(int i=0;i<top;i++) cout<<s[i].x<<" "<<s[i].y<<endl;*/ double ans=0; for(int i=0;i<top;i++) { for(int j=i+1;j<top;j++) { ans=max(ans,powdis(s[i],s[j])); } } return ans; } int main() { /* ios::sync_with_stdio(false); cin.tie(0);*/ while(~scanf("%d",&n)){ for(int i=0;i<n;i++) scanf("%lf%lf",&p[i].x,&p[i].y); printf("%.0f ",Graham()); } return 0; }
但是旋转卡壳死活过不了,
10 0 0 10000 0 1 100 2 199 9999 100 9998 199 100 -900 200 -1799 9800 -1799 9900 -900
这组数据过不了,
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<cassert> #include<iomanip> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 #pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; const double g=10.0,eps=1e-7; const int N=50000+10,maxn=500+100,inf=0x3f3f3f; struct point{ double x,y; }; point p[N],s[N]; int n; double dir(point p1,point p2,point p3) { return (p3.x-p1.x)*(p2.y-p1.y)-(p3.y-p1.y)*(p2.x-p1.x); } double dis(point p1,point p2) { return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)); } double powdis(point p1,point p2) { return (p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y); } bool comp(point p1,point p2) { double te=dir(p[0],p1,p2); if(te<0)return 1; if(te==0&&dis(p[0],p1)<dis(p[0],p2))return 1; return 0; } double Graham() { int pos; double minx,miny; minx=miny=inf; for(int i=0;i<n;i++) { if(p[i].x<minx||(p[i].x==minx&&p[i].y<miny)) { minx=p[i].x; miny=p[i].y; pos=i; } } swap(p[0],p[pos]); sort(p+1,p+n,comp); int top=2; p[n]=p[0]; s[0]=p[0],s[1]=p[1],s[2]=p[2]; for(int i=3;i<=n;i++) { while(top>=2&&dir(s[top-1],s[top],p[i])>0)top--; s[++top]=p[i]; } /* for(int i=0;i<top;i++) cout<<s[i].x<<" "<<s[i].y<<endl;*/ //Rotating Calipers double ans=0; int resx=0,resy=0; for(int i=0;i<top;i++) { if(s[i].x==s[0].x)resx++; if(s[i].y==s[0].y)resy++; } if(resx==top||resy==top)return powdis(s[0],s[top-1]); if(top==2)ans=powdis(s[0],s[1]); else { int j=2; for(int i=0;i<top;i++) { while(dir(s[i],s[i+1],s[j+1])>=dir(s[i],s[i+1],s[j])) j=(j+1)%top; // cout<<endl; // cout<<i<<" "<<j<<endl; // cout<<powdis(s[i],s[j])<<" "<<powdis(s[i],s[j+1])<<endl; ans=max(ans,max(powdis(s[j],s[i]),powdis(s[j+1],s[i]))); } } return ans; } int main() { /* ios::sync_with_stdio(false); cin.tie(0);*/ while(~scanf("%d",&n)){ for(int i=0;i<n;i++) scanf("%lf%lf",&p[i].x,&p[i].y); printf("%.0f ",Graham()); } return 0; } /* 4 0 0 0 1 1 1 1 0 */
不知道哪里出错了,希望有路过的大神帮忙改改错