题目大意:给n个点,求相聚最远距离的平方(输出整形)
集体思路:先求出包围所有点的凸包,然后暴力枚举求解(直接暴力会超时)
#include#include #include #include #include #include #include using namespace std;#define eps 0.0000000001#define PI acos(-1.0)//*******************************************************************************//点和向量struct Point{ double x,y; Point(double x=0,double y=0):x(x),y(y){}};typedef Point Vector;Vector operator-(Vector a,Vector b){ return Vector(a.x-b.x,a.y-b.y);}bool operator<(const Vector& a,const Vector& b){ return a.x 1、点排序2、删除重复的然后把前两个放进凸包//3、从第三个往后当新点在凸包前进左边时继续,否则一次删除最近加入的点,直到新点在左边int ConVexHull(Point* p,int n,Point*ch){ sort(p,p+n); int m=0; for(int i=0;i 1 && Cross(ch[m-1]-ch[m-2],p[i]-ch[m-2])<=0)m--; ch[m++]=p[i]; } int k=m; for(int i=n-2;i>=0;i--){ //上凸包 while(m>k && Cross(ch[m-1]-ch[m-2],p[i]-ch[m-2])<=0)m--; ch[m++]=p[i]; } if(n>1)m--; return m;}//*******************************************************************Point x[50005];Point ch[50005];int main(){ for(int n;cin>>n&&n;){ for(int i=0;i >x[i].x>>x[i].y; sort(x,x+n); int m=ConVexHull(x,n,ch); double maxx=-1,anss; for(int i=0;i maxx)maxx=anss; } } cout<<(int)maxx<<'\n'; }return 0;}