#include<iostream>
#include<algorithm>
#include<stdio.h>
using namespace std;
struct Point
{
long long x,y;
}point[100000],res[100000];
bool cmp(Point a,Point b)
{
return a.y<b.y||(a.y==b.y&&a.x<b.x);
}
long long ral(Point p0,Point p1,Point p2)
{
return (p1.x-p0.x)*(p2.y-p0.y) - (p2.x-p0.x)*(p1.y-p0.y);
}
long long dist(Point a,Point b)
{
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
int main()
{
int n;
scanf("%d",&n);
for (int i = 0;i<n;i++)
scanf("%I64d%I64d",&point[i].x,&point[i].y);
sort(point,point+n,cmp);
res[0] = point[0];
res[1] = point[1];
int top = 1;
for (int i = 2;i<n;i++)
{
while(top!=0 && ral(res[top],res[top-1],point[i]) <= 0)
top--;
res[++top] = point[i];
}
int len = top;
res[++top] = point[n - 2];
for (int i = n - 3;i>=0;i--)
{
while(top!=len && ral(res[top],res[top-1],point[i]) <= 0)
top--;
res[++top] = point[i];
}
int p = 1;
long long ans = 0;
for(int i = 0;i<top;i++)
{
while( ral(res[i+1],res[i],res[p+1]) > ral(res[i+1],res[i],res[p]) )
p = (p+1)%top;
ans = max(ans,max( dist(res[i+1],res[p+1]) , dist(res[i],res[p]) ));
}
printf("%I64d\n",ans);
// system("pause");
}
凸包+卡壳 最远点对
最新推荐文章于 2019-09-26 12:44:12 发布