最远点对 凸包 POJ 2187
2012-08-08 11:11
211 查看
/article/2843528.html
模版:
平均时间复杂度O(nlgn),最坏O(n * n)
View Code
模版:
平均时间复杂度O(nlgn),最坏O(n * n)
View Code
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<iostream> #include<vector> #include<string> #include<math.h> #include<map> #include<set> #include<algorithm> #define MAXN 200010 using namespace std; struct point { int x; int y; }p[50005]; int top,stack[50005]; inline int max(int a,int b) { return a>b?a:b; } inline int dis(const point a,const point b) { return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y); } inline int mult(const point p1,const point p2,const point p0) { return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y); } int cmp(const void *a,const void *b) { point *p1=(point*)a; point *p2=(point*)b; if(mult(*p1,*p2,p[0])<0) return 1; else if(mult(*p1,*p2,p[0])==0 && (*p1).x>(*p2).x) return 1; else return -1; } void graham(int n) { int i,min=0; for(i=0;i<n;i++) if(p[i].y<p[min].y || (p[i].y == p[min].y && p[i].x < p[min].x)) min=i; point temp=p[0]; p[0]=p[min]; p[min]=temp; qsort(p+1,n-1,sizeof(point),cmp); stack[0]=0; stack[1]=1; stack[2]=2; top=2; for(i=3;i<n;i++) { while(top>0 && mult(p[i],p[stack[top]],p[stack[top-1]])>=0) top--; stack[++top]=i; } } /*int find_max() { int maxdis=0; for(int i=0;i<=top;i++) for(int j=i+1;j<=top;j++) if(maxdis<dis(p[stack[i]],p[stack[j]])) maxdis=dis(p[stack[i]],p[stack[j]]); return maxdis; }*/ int rotating_calipers() //卡壳 { int i , q=1; int ans = 0; for(i = 0 ; i < top ; i++) { while( mult( p[stack[i+1]] , p[stack[q+1]] , p[stack[i]] ) > mult( p[stack[i+1]] , p[stack[q]] , p[stack[i]] ) ) q = (q+1)%(top); ans = max(ans , max( dis(p[stack[i]] , p[stack[q]]) , dis(p[stack[i+1]] , p[stack[q+1]]))); } return ans; } int main() { int N; scanf("%d",&N); for(int i=0;i<N;i++) scanf("%d %d",&p[i].x,&p[i].y); graham(N); printf("%d\n",rotating_calipers()/*find_max()*/); return 0; }
相关文章推荐
- POJ 2187 Beauty Contest (凸包)
- 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 (凸包-Graham扫描算法)
- POJ 2187:Beauty Contest (凸包+旋转卡壳)
- POJ2187:Beauty Contest(凸包 & 旋转卡壳)
- POJ训练计划2187_Beauty Contest(几何/凸包)
- poj 2187 Beauty Contest 凸包 Graham
- 凸包问题 poj 2187
- poj 2187 Beauty Contest (凸包)
- POJ 2187 Beauty Contest 构造凸包 + 旋转卡壳
- POJ Beauty Contest 2187 (凸包)
- POJ 2187 凸包旋转卡壳
- POJ 2187 求凸包上最长距离
- POJ(2187)用凸包求最远点对