POJ 2187 求凸包上最长距离

 简单的旋转卡壳题目

以每一条边作为基础,找到那个最远的对踵点,计算所有对踵点的点对距离

这里求的是距离的平方,所有过程都是int即可

 

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <cmath>
 6 #include <algorithm>
 7 using namespace std;
 8 #define N 50010
 9 #define eps 1e-9
10 int n , top;
11 
12 int dcmp(double x)
13 {
14     if(fabs(x)<eps) return 0;
15     return x<0?-1:1;
16 }
17 
18 struct Point{
19     int x,y;
20     Point(int x=0 , int y=0):x(x),y(y){}
21     bool operator==(const Point &m) const{
22         return x==m.x&&y==m.y;
23     }
24     int squaredDis(){return x*x+y*y;}
25     void input(){scanf("%d%d" , &x , &y);}
26     void print(){cout<<x<<" "<<y<<endl;}
27 }po[N] , rec[N] , p;
28 typedef Point Vector;
29 
30 Vector operator+(Vector a , Vector b){return Vector(a.x+b.x , a.y+b.y);}
31 Vector operator-(Vector a , Vector b){return Vector(a.x-b.x , a.y-b.y);}
32 Vector operator*(Vector a , double b){return Vector(a.x*b , a.y*b);}
33 Vector operator/(Vector a , double b){return Vector(a.x/b , a.y/b);}
34 
35 int Cross(Vector a , Vector b){return a.x*b.y-b.x*a.y;}
36 double Len(Vector a){return sqrt(a.x*a.x*1.0+a.y*a.y);}
37 
38 bool cmp(Point a , Point b){
39     int v = Cross(a , b);
40     if(v == 0) return a.x<b.x;
41     else return v>0;
42 }
43 
44 void Graham(Point *a , Point *rec)
45 {
46     sort(a , a+n , cmp);
47   //  for(int i=0 ; i<n ; i++) cout<<i<<" "<<a[i].x<< " "<<a[i].y<<endl;
48     rec[0] = a[0] , rec[1] = a[1];
49     top=1;
50     for(int i=2 ; i<n ; i++){
51         while(top>0 && Cross(rec[top]-rec[top-1] , a[i]-rec[top-1])<=0)
52             top--;
53         rec[++top] = a[i];
54     }
55    // for(int i=0 ; i<=top ; i++) cout<<i<<" "<<rec[i].x<< " "<<rec[i].y<<endl;
56     int tmp = top;
57     for(int i=n-1 ; i>=0 ; i--){
58         while(top>tmp && Cross(rec[top]-rec[top-1] , a[i]-rec[top-1])<=0)
59             top--;
60         rec[++top]=a[i];
61     }
62   //  for(int i=0 ; i<=top ; i++) cout<<i<<" "<<rec[i].x<< " "<<rec[i].y<<endl;
63 }
64 
65 int maxDis(Point *a)
66 {
67     int la=top-1 , p=0 , q=0;
68     int maxn = 0;
69     for(p=0 ; p<top ; p++){
70         while(Cross(a[p]-a[la] , a[q+1]-a[la]) - Cross(a[p]-a[la] , a[q]-a[la])>0)
71             q=(q+1)%top;
72         maxn = max(maxn , (a[q]-a[la]).squaredDis());
73         maxn = max(maxn , (a[q]-a[p]).squaredDis());
74         la = p;
75     }
76     return maxn;
77 }
78 
79 int main()
80 {
81    // freopen("a.in" , "r" , stdin);
82     while(~scanf("%d" , &n))
83     {
84         for(int i=0 ; i<n ; i++) po[i].input();
85         p = po[0];
86         for(int i=1 ;i<n ; i++)
87             if(po[i].y<p.y||(po[i].y==p.y&&po[i].x<p.x)) p=po[i];
88         Graham(po , rec);
89         int ans = maxDis(rec);
90         cout<<ans<<endl;
91     }
92     return 0;
93 }

 

你可能感兴趣的:(poj)