POJ2187 旋转卡壳+凸包

题意:给定一些点,求最远的点的距离。

凸包+旋转卡壳

View Code
  1 /*

  2 旋转卡壳

  3 凸包中的点为顺时针存储

  4 */

  5 #include<stdio.h>

  6 #include<string.h>

  7 #include<stdlib.h>

  8 #include<algorithm>

  9 #include<iostream>

 10 #include<queue>

 11 //#include<map>

 12 #include<math.h>

 13 using namespace std;

 14 typedef long long ll;

 15 //typedef __int64 int64;

 16 const int maxn = 50005;

 17 const int inf = 0x7fffffff;

 18 struct node{

 19     int x,y;

 20     bool operator <( const node &p ) const {

 21         return y<p.y||(y==p.y&&x<p.x);

 22     }

 23 };

 24 node pnt[ maxn ],res[ maxn ];

 25 int cross( node sp,node ep,node op ){

 26      return (sp.x - op.x) * (ep.y - op.y)-(ep.x - op.x) * (sp.y - op.y);

 27 }

 28 /*

 29 ep

 30 |

 31 |

 32 op----sp

 33 ( from sp to ep )

 34 */

 35 

 36 int dis2( node a,node b ){

 37     return (( a.x-b.x )*( a.x-b.x )+( a.y-b.y )*( a.y-b.y ));

 38 }

 39 

 40 int graham( int n ){

 41     int top=1;

 42     sort( pnt,pnt+n );//!!!!!

 43     if( n==0 ) return 0;

 44     else res[ 0 ]=pnt[ 0 ];

 45     if( n==1 ) return 1;

 46     else res[ 1 ]=pnt[ 1 ];

 47     if( n==2 ) return 2;

 48     else res[ 2 ]=pnt[ 2 ];

 49     

 50     for( int i=2;i<n;i++ ){

 51         while( top>0&&cross( res[ top ],pnt[ i ],res[ top-1 ] )>=0 )

 52             top--;

 53         res[ ++top ]=pnt[ i ];

 54     }

 55     int tmp=top;

 56     res[ ++top ]=pnt[ n-2 ];

 57     for( int i=n-3;i>=0;i-- ){

 58         while( top!=tmp&&cross( res[ top ],pnt[ i ],res[ top-1 ] )>=0 )

 59             top--;

 60         res[ ++top ]=pnt[ i ];

 61     }

 62     return top;

 63 }

 64 

 65 int rotating( int n ){

 66     int q=1;

 67     int ans=0;

 68     res[ n ]=res[ 0 ];

 69     for( int i=0;i<n;i++ ){

 70         while( cross( res[ i ],res[ q+1 ],res[ i+1 ] )>cross( res[ i ],res[ q ],res[ i+1 ] ) )    

 71             q=(q+1)%n;

 72         ans=max( ans,max( dis2( res[i],res[q] ),dis2( res[i+1],res[q+1] ) ) );

 73     }

 74     return ans;

 75 }

 76 /*

 77 void test(){

 78     int sum=0;

 79     node a,b,c;

 80     a.x=a.y=1;

 81     b.x=3,b.y=1;

 82     c.x=1,c.y=7;

 83     printf("%d\n",cross(a,b,c));

 84 }    

 85 */

 86 /*

 87 void test2( int cnt ){

 88     printf("\n");

 89     for( int i=0;i<cnt;i++ )

 90         printf("%d %d\n",res[i].x,res[i].y);

 91     printf("\n");

 92 }

 93 */

 94 int main(){

 95     int n;

 96     //test();

 97     while( scanf("%d",&n)!=EOF ){

 98         for( int i=0;i<n;i++ )

 99             scanf("%d%d",&pnt[ i ].x,&pnt[ i ].y);

100         int cnt=graham( n );

101         //test2(cnt);

102         printf("%d\n",rotating( cnt ));

103     }

104     return 0;

105 }

 

你可能感兴趣的:(poj)