平面上有n个牧场。i号牧场在点(xi,yi),所有牧场位置互不相同。计算距离最远的两个牧场间的距离,输出最远距离的平方。
2<=n<=50000
-10000<=xi,yi<=10000
Sample Input
4
0 0
0 1
1 1
1 0
Sample Output
2
在凸包内部的点肯定不会是最远点对之一,可以不考虑,只枚举在凸包上的所有点对距离长度,并进行比较即可
建凸包
当加入一个新的点1,这个点和上两个点2、3组成的角是锐角,则表示点2凹进去了,不是凸包上的点,把点2删去
#include<stdio.h>
#include<vector>
#include<algorithm>
#include<string.h>
#include<iostream>
#include<fstream>
#include<math.h>
#include<stack>
#include<bitset>
#include<utility>
using namespace std;
typedef long long ll;
const double eps=0.0000000000001;
const int mod=1000000007;
int n;
struct P{
double x;
double y;
P(){}
P(double _x,double _y){
x = _x;y = _y;
}
P operator -(const P &b)const{
return P(x - b.x,y - b.y);
}
};
P ps[50005];
bool cmp_p(P a,P b){
if(a.x==b.x)return a.y<b.y;
else return a.x<b.x;
}
double cross(P a,P b,P c){
//计算叉积
return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);
}
vector<P> get_convex_hull(P*ps,int n){
//得到组成凸包的点
sort(ps,ps+n,cmp_p);
vector<P> ch(n*2);
int k=0;
for(int i=0;i<n;i++){
while(k>1&&cross(ch[k-1],ch[k-2],ps[i])<=0)k--;
ch[k]=ps[i];
k++;
}
for(int i=n-2,t=k;i>=0;i--){
while(k>t&&cross(ch[k-1],ch[k-2],ps[i])<=0)k--;
ch[k]=ps[i];
k++;
}
ch.resize(k-1);
return ch;
}
double dist(P a,P b){
//距离的平方
return (b.x-a.x)*(b.x-a.x)+(b.y-a.y)*(b.y-a.y);
}
void solve(){
vector<P> ch=get_convex_hull(ps,n);
double ans=0;
for(int i=0;i<ch.size();i++){
for(int j=i+1;j<ch.size();j++){
ans=max(ans,dist(ch[i],ch[j]));
}
}
printf("%.0f\n",ans);
}
int main(){
scanf("%d",&n);
double a,b;
for(int i=0;i<n;i++){
scanf("%lf%lf",&a,&b);
ps[i].x=a;
ps[i].y=b;
}
solve();
return 0;
}