题目链接:http://poj.org/problem?id=2187
题目意思很明了,就是给出点集,求平面最远两点的距离的平方
第一次接触了旋转卡壳,让我注意到了我自已整理的凸包模版的可靠性,那就是还不可靠。。。
用了自己写的卷包裹法->wa,用浙大的模版->wa,用两个半凸多边形也有好多不同的写法,有的写法会出现各种问题,比如所有的点共线的问题。最终,以Graham2这个求凸包函数没wa。
旋转卡壳,可参考:http://www.cnblogs.com/Booble/archive/2011/04/03/2004865.html,里面讲的不错。还需要注意的是旋转卡壳的方向与凸包的方向要对应。
代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<math.h>
#include<cstdlib>
#define eps 1e-8
#define maxn 100000
#define PI acos(-1.0)
using namespace std;
struct point {int x,y;}points[maxn],temp[maxn],save[maxn];
int n,nsave;
int xmult(point p1,point p2,point p0)
{
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
int max(int a,int b){return a>b? a:b;}
bool zero(int x){return x>0? x<eps:x>-eps;}
bool cmp(const point &a,const point &b)
{
if(a.y==b.y)return a.x<b.x;
return a.y<b.y;
}
int dist2(point p1,point p2)
{
return (p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y);
}
point dir;
void Graham2()
{
sort(temp,temp+n,cmp);
save[0]=temp[0];
save[1]=temp[1];
if(n<=2){nsave=n;return ;}
int i,top=1;
for(i=2;i<n;i++)
{//??ê±??
while(top>0&& xmult(temp[i],save[top],save[top-1])<=0)top--;
save[++top]=temp[i];
}
// save[++top]=temp[n-2];
int mid=top;
for(i=n-2;i>=0;i--)
{
while(top>=mid+1 && xmult(temp[i],save[top],save[top-1])<=0)top--;
save[++top]=temp[i];
}
nsave=top;
}
int ratat()//Dy×a?¨??
{
int j=1;
int ans=0;
int i;
save[nsave]=save[0];
for(i=0;i<nsave;i++)
{
while(xmult(save[j+1],save[i+1],save[i])>xmult(save[j],save[i+1],save[i]))
j=(j+1)%nsave;
ans=max(ans,max(dist2(save[i],save[j]),
dist2(save[i+1],save[j+1])
)
);
}
return ans;
}
void pri()
{
int i;
printf("nsave: %d\n",nsave);
for(i=0;i<nsave;i++)
printf("save: %d %d\n",save[i].x,save[i].y);
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
int i;
for(i=0;i<n;i++)
{
scanf("%d%d",&points[i].x,&points[i].y);
temp[i].x=points[i].x;
temp[i].y=points[i].y;
}
int st=n;
// n=unique(temp,temp+n,equal_p)-temp;
Graham2();
// pri();
printf("%d\n",ratat());
}
return 0;
}
分享到:
相关推荐
北大POJ2187-Beauty Contest 解题报告+AC代码
O(nlogn)凸包问题 poj2187
NULL 博文链接:https://128kj.iteye.com/blog/1749213
poj上的测室数据,需要的下载........
POJ 最接近点对问题 ACM北大 using namespace std; struct Point { float x; float y; };
POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类
计算几何半平面交,poj2451 一题是模版题,这里的代码可以作为模版使用,速度比较快
poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题...
POJ2009年最新版,相当详细.................
POJ第1861题源码 POJ第1861题源码 POJ第1861题源码
poj分类poj分类poj分类poj分类
poj 3752 字母旋转游戏.md
北大POJ1159-Palindrome 解题报告+AC代码
poj 3414解题报告poj 3414解题报告poj 3414解题报告poj 3414解题报告
poj 1012解题报告poj 1012解题报告poj 1012解题报告poj 1012解题报告
poj 2329解题报告poj 2329解题报告poj 2329解题报告poj 2329解题报告
poj 1659解题报告poj 1659解题报告poj 1659解题报告poj 1659解题报告
C语言 poj npu 西工大 C语言Poj答案全完整打包,给有需要的朋友
poj1379 给予平面内一个点集; 使用模拟退火求出一个点使该点到上述点集内任意一点最短距离最长。
POJ1503解答 POJ1503解答,正确答案(已通过POJ)