#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int N=60005;
inline int dcmp(int x){
if(!x)return 0;
return x>0?1:-1;
}
struct pt{
int x,y;
}p[N],ans[N];
int top,n;
int s[N];
inline int dis(pt a,pt b){
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
inline int cross(pt a,pt b,pt c){
return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);
}
bool cmp(pt a,pt b){
int ans=cross(p[0],a,b);
if(ans >0 || (!ans && dis(p[0],a)>dis(p[0],b)))return true;
return false;
}
void graham(){
s[0]=0;s[1]=1;top=1;
for(int i=2;i!=n;i++){
while(top && cross(p[s[top-1]],p[s[top]],p[i])<0)top--;
s[++top]=i;
}
top++;
}
inline int rotating_calipers(){
int q=1;s[top]=s[0];q=1;
int ans=dis(p[s[0]],p[s[1]]);
for(int i=0;i<top;i++){
while(abs(cross(p[s[i+1]],p[s[i]],p[s[q+1]]))>abs(cross(p[s[i+1]],p[s[i]],p[s[q]])))
q=(q+1)%top;
ans=max(ans,max(dis(p[s[i]],p[s[q]]),dis(p[s[(i+1)%top]],p[s[q]])));
}
return ans;
}
int main(){
int i,x=0;
x=0;
memset(s,0,sizeof(s));
cin>>n;
for(i=0;i<n;i++){
scanf("%d%d",&p[i].x,&p[i].y);
if(p[x].y>p[i].y || (p[x].y == p[i].y && p[x].x>p[i].x))x=i;
}if(x)
swap(p[0],p[x]);
sort(p+1,p+n,cmp);
graham();
cout<<rotating_calipers()<<endl;
return 0;
}poj2187Beauty Contest 凸包最大距离
最新推荐文章于 2020-12-24 16:43:14 发布
本文详细介绍了使用C++语言实现Graham扫描算法求凸包的过程,并通过旋转刻刀算法验证了结果。

349

被折叠的 条评论
为什么被折叠?



