UVa 1453 - Squares 旋转卡壳求凸包直径

旋转卡壳求凸包直径。

参考:http://www.cppblog.com/staryjy/archive/2010/09/25/101412.html

  1 #include <cstdio>
  2 #include <cmath>
  3 #include <algorithm>
  4 
  5 using namespace std;
  6 
  7 const int MAXN = 100022 << 2;
  8 
  9 struct Point
 10 {
 11     int x, y;
 12     Point( int x = 0, int y = 0 ):x(x), y(y) { }
 13 };
 14 
 15 typedef Point Vector;
 16 
 17 Vector operator+( Vector A, Vector B )       //向量加
 18 {
 19     return Vector( A.x + B.x, A.y + B.y );
 20 }
 21 
 22 Vector operator-( Vector A, Vector B )       //向量减
 23 {
 24     return Vector( A.x - B.x, A.y - B.y );
 25 }
 26 
 27 Vector operator*( Vector A, double p )      //向量数乘
 28 {
 29     return Vector( A.x * p, A.y * p );
 30 }
 31 
 32 Vector operator/( Vector A, double p )      //向量数除
 33 {
 34     return Vector( A.x / p, A.y / p );
 35 }
 36 
 37 bool operator<( const Point& A, const Point& B )   //两点比较
 38 {
 39     return A.x < B.x || ( A.x == B.x && A.y < B.y );
 40 }
 41 
 42 double Cross( Vector A, Vector B )   //向量叉积
 43 {
 44     return A.x * B.y - A.y * B.x;
 45 }
 46 
 47 int ConvexHull( Point *p, int n, Point *ch )
 48 {
 49     sort( p, p + n );
 50     int m = 0;
 51     for ( int i = 0; i < n; ++i )
 52     {
 53         while ( m > 1 && Cross( ch[m - 1] - ch[m - 2], p[i] - ch[m - 2] ) <= 0 ) --m;
 54         ch[m++] = p[i];
 55     }
 56 
 57     int k = m;
 58     for ( int i = n - 2; i >= 0; --i )
 59     {
 60         while ( m > k && Cross( ch[m - 1] - ch[m - 2], p[i] - ch[m - 2] ) <= 0 ) --m;
 61         ch[m++] = p[i];
 62     }
 63 
 64     if ( n > 1 ) --m;
 65     return m;
 66 }
 67 
 68 int dist( Point a, Point b )
 69 {
 70     return (a.x - b.x)*(a.x - b.x)+(a.y - b.y)*(a.y - b.y);
 71 }
 72 
 73 int RotatingCalipers( Point *ch, int n )
 74 {
 75     int q = 1;
 76     int ans = 0;
 77     for ( int i = 0; i < n; ++i )
 78     {
 79         while ( Cross( ch[i + 1] - ch[i], ch[q + 1] - ch[i] ) > Cross( ch[i + 1] - ch[i], ch[q] - ch[i] ) )
 80             q = ( q + 1 ) % n;
 81         ans = max( ans, max( dist( ch[i], ch[q] ), dist( ch[i + 1], ch[q + 1] ) ) );
 82     }
 83     return ans;
 84 }
 85 
 86 Point read_Point( int x, int y )
 87 {
 88     return Point( x, y );
 89 }
 90 
 91 Point P[MAXN], ch[MAXN];
 92 
 93 int main()
 94 {
 95     int T;
 96     scanf( "%d", &T );
 97     while ( T-- )
 98     {
 99         int N, cnt = 0;
100         scanf( "%d", &N );
101         for ( int i = 0; i < N; ++i )
102         {
103             int x, y, len;
104             scanf( "%d%d%d", &x, &y, &len );
105             P[cnt++] = read_Point( x, y );
106             P[cnt++] = read_Point( x + len, y );
107             P[cnt++] = read_Point( x, y + len );
108             P[cnt++] = read_Point( x + len, y + len );
109         }
110 
111         int m = ConvexHull( P, cnt, ch );
112         printf("%d\n", RotatingCalipers( ch, m ) );
113     }
114     return 0;
115 }

 

posted @ 2013-06-17 22:10  冰鸮  阅读(280)  评论(0编辑  收藏  举报