POJ 2187 Beauty Contest(凸包&&平面最远点对)
2016-03-29 21:02
405 查看
利用graham算法枚举凸包。
#include<map> #include<cmath> #include<queue> #include<cmath> #include<cstdio> #include<stack> #include<iostream> #include<cstring> #include<algorithm> #define inf 999999999.9 #define eps 1e-8 #define ls l,mid,rt<<1 #define rs mid+1,rt,rt<<1|1 #define LL __int64 using namespace std; struct P{ int x,y; }p[50005],s[50005]; int n,top; int dis(P a,P b){ return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y); } P operator-(P a,P b){ P t;t.x=a.x-b.x;t.y=a.y-b.y;return t; } int operator*(P a,P b){ return a.x*b.y-a.y*b.x; } bool operator<(P a,P b){ int t=(a-p[1])*(b-p[1]); if(t==0)return dis(a,p[1])<dis(b,p[1]); return t>0; } void Graham(){ int k = 1; for(int i = 2;i <= n;++ i ){ if( (p[k].y > p[i].y)||(p[k].y == p[i].y && p[k].x > p[i].x) ) k = i; } swap(p[1],p[k]); sort(p + 2,p + n + 1); s[1]=p[1]; s[2]=p[2];top = 2; for(int i = 3;i <= n; ++ i){ while(top > 1&&(p[i] - s[top - 1])*(s[top]-s[top-1]) >= 0) top--; s[++top] = p[i]; } } int RC(){ int q = 2,ans = 0; s[top+1 ]= p[1]; for(int i = 1;i <= top;++ i){ while((s[i+1]-s[i])*(s[q+1]-s[i])>(s[i+1]-s[i])*(s[q]-s[i]) ) q = q%top+1; ans = max(ans,max(dis(s[q+1],s[i+1]),dis(s[q],s[i]))); } return ans; } int main(){ int j,i; while(~scanf("%d",&n)){ for(int i = 1;i <= n;++ i){ scanf("%d%d",&p[i].x,&p[i].y); } Graham(); printf("%d",RC()); } return 0; }
相关文章推荐
- 初学算法 - 求凸包的Garham's Scan算法的C++实现
- 【Google Code Jam 2009 round2 problem D】Watering Plants (两圆交点求法详解)
- 计算几何模板
- 计算几何小模板
- BZOJ2829信用卡凸包
- 凸包问题 hdu1392 Surround the Trees
- HDU 4922 Hello, Your Package! (计算几何+DP)(WA)
- poj 1514&zoj 1185 Metal Cutting(半平面交)
- UVA 10969 Sweet Dream(圆的相交)
- uva 11177 Fighting Against a Polygonal Monster(凸包与圆的面积交)
- POJ1279 && LA2512 Art Gallery(求多边形的核)
- poj 2540 && uva 10084 Hotter Colder(半平面交)
- UVALive 5878 - Shortest Leash 【计算几何】
- 【计算几何】POJ 2318 & POJ 2398
- 【计算几何】POJ 2653
- 【计算几何】POJ 1113
- HDU 5128 The E-pang Palace
- 计算几何问题汇总--圆与矩形
- 计算几何问题汇总--点与线的位置关系
- UVa 10652 Board Wrapping