模板 旋转卡壳 poj2187

Posted xiaobuxie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板 旋转卡壳 poj2187相关的知识,希望对你有一定的参考价值。

题目链接:https://vjudge.net/problem/POJ-2187

旋转卡壳模板题。参考了hzwer(http://hzwer.com/4224.html

技术图片
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #define eps 1e-8
 6 using namespace std;
 7 int n,top;
 8 const int N = 5e4+9;
 9 int sta[N];
10 struct Point
11     double x,y;
12     Point operator - (const Point& b)const
13         return (Point)x-b.x,y-b.y;
14     
15     double operator ^ (const Point& b)const
16         return x*b.y - b.x*y;
17     
18 p[N],p0; 
19 bool cmp(Point a,Point b)
20     if(atan2(a.y - p0.y,a.x - p0.x) != atan2(b.y - p0.y,b.x - p0.x))
21         return atan2(a.y - p0.y,a.x - p0.x) < atan2(b.y - p0.y,b.x - p0.x);
22     
23     return a.x < b.x;
24 
25 double dis2(Point a,Point b)
26     return (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y);
27 
28 void init()
29     int k=0;
30     scanf("%lf %lf",&p[0].x,&p[0].y);
31 //    cin>>p[0].x>>p[0].y;
32     p0 = p[0];
33     for(int i = 1;i<n;++i)
34         scanf("%lf %lf",&p[i].x,&p[i].y);
35 //        cin>>p[i].x>>p[i].y;
36         if( (p0.y > p[i].y) || (p0.y == p[i].y && p0.x > p[i].x))
37             p0 = p[i];
38             k = i;
39         
40     
41     p[k] = p[0];
42     p[0] = p0;
43     sort(p+1,p+n,cmp);
44 
45 void graham()
46     if(n == 2)
47         top = 1;
48         sta[0] = 0;
49         sta[1] = 1;
50         return;
51     
52     sta[0] = 0; sta[1] = 1; top = 1;
53     for(int i = 2;i<n;++i)
54         while( top>0 && ( (p[sta[top]] - p[sta[top-1]]) ^ (p[i]-p[sta[top-1]]) ) <= 0 ) --top;
55         sta[++top] = i;
56     
57 
58 void RC()
59     sta[top+1] = sta[0];
60     int now = 1;
61     double ans = 0;
62     for(int i = 0;i<=top;++i)
63         while( ((p[sta[i+1]]-p[sta[i]])^(p[sta[now]] - p[sta[i]])) < ((p[sta[i+1]]-p[sta[i]])^(p[sta[now+1]]-p[sta[i]])) )
64             ++now;
65             if(now == top+1) now = 0;
66         
67         ans = max(ans,max(dis2(p[sta[i]],p[sta[now]]),dis2(p[sta[i+1]],p[sta[now]])));
68     
69     printf("%d\n",(int)ans);
70 
71 int main()
72     scanf("%d",&n);
73     init();
74     graham();
75     RC();
76     return 0;
77 
View Code

 

以上是关于模板 旋转卡壳 poj2187的主要内容,如果未能解决你的问题,请参考以下文章

POJ2187 Beauty Contest (旋转卡壳算法 求直径)

poj 2187旋转卡壳

算法复习——凸包加旋转卡壳(poj2187)

poj 2187 Beauty Contest——旋转卡壳

POJ2187(凸包+旋转卡壳)

模板旋转卡壳求 面积最大的三角形 poj2079