#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
struct point{
int x,y;
};
bool mult(point sp,point ep,point op){
return (sp.x-op.x)*(ep.y-op.y) >= (ep.x-op.x)*(sp.y-op.y);
}
bool operator <(const point& l,const point &r){
return l.y < r.y || (l.y == r.y && l.x < r.x);
}
int graham(point pnt[],int n,point res[]){
int i,len,k = 0,top = 1;
sort(pnt,pnt+n);
if(n == 0) return 0;
res[0] = pnt[0];
if(n == 1) return 1;
res[1] = pnt[1];
if(n == 2) return 2;
res[2] = pnt[2];
for(i = 2;i < n;i++){
while(top && mult(pnt[i],res[top],res[top-1]))
{
top--;
}
res[++top] = pnt[i];
//cout << 'a' << endl;
}
len = top;
res[++top] = pnt[n-2];
for(i = n - 3;i >= 0;i--){
while(top!= len && mult(pnt[i],res[top],res[top-1])) top--;
res[++top] = pnt[i];
}
return top;
}
point p[50005];
point ans[50005];
int dis(point a,point b){
int dx = b.x - a.x;
int dy = b.y - a.y;
return dx * dx + dy * dy;
}
int main(){
int n;
while(cin >> n){
for(int i = 0;i < n;i++){
scanf("%d%d",&p[i].x,&p[i].y);
}
int nr = graham(p,n,ans);
int cou = 0;
for(int i = 0;i < nr;i++){
for(int j = 0;j < nr;j++){
int tmp = dis(ans[i],ans[j]);
if(tmp >= cou){
cou = tmp;
}
}
}
printf("%d\n",cou);
}
return 0;
}
POJ2187 n个点找距离最远的点对距离 graham 凸包
最新推荐文章于 2021-07-15 21:21:27 发布