您的位置:首页 > 其它

poj 2187 Beauty Contest 凸包 Graham

2017-02-16 16:21 429 查看
题目大意:给出n个点的坐标,求最远的两个点的距离的平方(点对距离最大值)

可以想到相隔最远的两个点一定都是在凸包上的,于是直接求凸包然后枚举得出最大距离

求凸包用的是Graham扫描法 可以参考Graham扫描法

更多求凸包的方法 可以参考凸包问题的解法

#include<cstdio>
#include<algorithm>
#define N 50005
using namespace std;

struct node{
int x,y;
}p
,s
;
int n;

inline int read(){
int a=0;char f=1,c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){a=a*10+c-'0';c=getchar();}
return a*f;
}

inline int dir(node p1,node p2,node p3){
return (p1.x-p3.x)*(p2.y-p3.y)-(p1.y-p3.y)*(p2.x-p3.x);
}

inline int pw(int x){return x*x;}

inline int calc(node a,node b){
return pw(a.x-b.x)+pw(a.y-b.y);
}

inline bool cmp(node a,node b){
int tmp=dir(p[1],a,b);
if(tmp<0||(tmp==0&&calc(p[1],a)>calc(p[1],b))) return 0;
return 1;
}

int main(){
freopen("testdata.in","r",stdin);
freopen("testdata.out","w",stdout);
n=read();
p[0].x=2e9,p[0].y=2e9;
int tmp=0;
for(int i=1;i<=n;++i){
p[i].x=read(),p[i].y=read();
if(p[i].x<p[tmp].x||p[i].x==p[tmp].x&&p[i].y<p[tmp].y) tmp=i;
}
if(tmp!=1) swap(p[1],p[tmp]);
sort(p+2,p+n+1,cmp);
int top=2;
s[1]=p[1],s[2]=p[2];
for(int i=3;i<=n;++i){
while(top>1&&dir(s[top-1],s[top],p[i])<=0) --top;
s[++top]=p[i];
}
int ans=0;
for(int i=1;i<=top;++i)
for(int j=1;j<=top;++j)
ans=max(ans,calc(s[i],s[j]));
        printf("%d\n",ans);
return 0;
}
写给自己:刚接触凸包,用了不少时间,但是其中涉及到的很多东西依旧不太明白,要及时填坑到弄明白为止
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: