poj 2187 求凸包最远点对--旋转卡壳
2012-05-03 09:01
489 查看
【题意】
求最远点对
【题解】
凸包+旋转卡壳
没学过旋转卡壳的,提供一个链接/article/7025041.html
【代码】
求最远点对
【题解】
凸包+旋转卡壳
没学过旋转卡壳的,提供一个链接/article/7025041.html
【代码】
#include <iostream> #include <algorithm> #include <cmath> using namespace std; const int maxn=100003; struct point { int x,y; }p[maxn],s[maxn]; int xmult(point p1,point p2,point p0) { return (p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x); } int dist(point p1,point p2) { return (p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y); } int cmp(point a,point b) { return a.y<b.y || a.y==b.y && a.x<b.x; } int main() { freopen("pin.txt","r",stdin); freopen("pou.txt","w",stdout); int i,j,k,t,n,tmp,ans; cin >> n; for (i=0;i<n;i++) cin >> p[i].x >> p[i].y; sort(p,p+n,cmp); s[0]=p[0];s[1]=p[1]; k=1; for (i=2;i<n;i++) { while (k && xmult(p[i],s[k],s[k-1])>=0) k--; s[++k]=p[i]; } tmp=k; s[++k]=p[n-2]; for (i=n-3;i>=0;i--) { while (k>tmp && xmult(p[i],s[k],s[k-1])>=0) k--; s[++k]=p[i]; } s[k]=p[0]; for (ans=0,t=1,i=0;i<k;i++) { while (xmult(s[i+1],s[t],s[i])<xmult(s[i+1],s[t+1],s[i])) t=(t+1)%k; int a1=dist(s[i],s[t]); int a2=dist(s[i+1],s[t+1]); if (a1>ans) ans=a1; if (a2>ans) ans=a2; } cout << ans; return 0; }
相关文章推荐
- poj 2187 Beauty Contest(凸包+旋转卡壳)
- POJ 2187 Beauty Contest (求最远点对,凸包+旋转卡壳)
- 【凸包直径&平面最远点对&对锺点(旋转卡壳)】poj 2187 Beauty Contest
- 【POJ 2187】Beauty Contest 凸包+旋转卡壳
- POJ2187:Beauty Contest(凸包 & 旋转卡壳)
- POJ 2187 凸包+旋转卡壳
- poj 2187 求平面最远点对 快速凸包 旋转卡壳
- POJ 2187 Beauty Contest [凸包,旋转卡壳]
- poj 2187(凸包+旋转卡壳)
- poj 2187 Beauty Contest(二维凸包旋转卡壳)
- 【凸包】poj 2187 Beauty Contest (旋转卡壳求平面最远点对)
- POJ 2187 Beauty Contest(凸包+旋转卡壳)
- POJ 2187 Beauty Contest【旋转卡壳求凸包直径】
- poj 2187 Beauty Contest(二维凸包旋转卡壳)
- [Poj 2187]计算几何之凸包(三) {旋转卡壳初步}
- POJ 2187 Beauty Contest【旋转卡壳求凸包直径】
- poj 2187 Beauty Contest , 旋转卡壳求凸包的直径的平方
- POJ 2187 Beauty Contest 构造凸包 + 旋转卡壳
- poj 2187 Beauty Contest 题解(凸包模板+旋转卡壳)
- POJ 2187 Beauty Contest 构造凸包 + 旋转卡壳