• poj 2187 N个点中输出2点的最大距离的平方


    旋转卡壳

    Sample Input

    4
    0 0
    0 1
    1 1
    1 0
    Sample Output

    2

      1 # include <iostream>
      2 # include <cstdio>
      3 # include <cstring>
      4 # include <algorithm>
      5 # include <string>
      6 # include <cmath>
      7 # include <queue>
      8 # define LL long long
      9 using namespace std ;
     10 
     11 struct Point
     12 {
     13     int x,y;
     14     Point(int _x = 0,int _y = 0)
     15     {
     16         x = _x; y = _y;
     17     }
     18     Point operator -(const Point &b)const
     19     {
     20         return Point(x - b.x, y - b.y);
     21     }
     22     int operator ^(const Point &b)const
     23     {
     24         return x*b.y - y*b.x;
     25     }
     26     int operator *(const Point &b)const
     27     {
     28         return x*b.x + y*b.y;
     29     }
     30     void input()
     31     {
     32         scanf("%d%d",&x,&y);
     33     }
     34 };
     35 //距离的平方
     36 int dist2(Point a,Point b)
     37 {
     38     return (a-b)*(a-b);
     39 }
     40 //******二维凸包,int***********
     41 const int MAXN = 50010;
     42 Point list[MAXN];
     43 int Stack[MAXN],top;
     44 bool _cmp(Point p1,Point p2)
     45 {
     46     int tmp = (p1-list[0])^(p2-list[0]);
     47     if(tmp > 0)return true;
     48     else if(tmp == 0 && dist2(p1,list[0]) <= dist2(p2,list[0]))
     49     return true;
     50     else return false;
     51 }
     52 void Graham(int n)
     53 {
     54     Point p0;
     55     int k = 0;
     56     p0 = list[0];
     57     for(int i = 1;i < n;i++)
     58         if(p0.y > list[i].y || (p0.y == list[i].y && p0.x > list[i].x))
     59         {
     60             p0 = list[i];
     61             k = i;
     62         }
     63     swap(list[k],list[0]);
     64     sort(list+1,list+n,_cmp);
     65     if(n == 1)
     66     {
     67         top = 1;
     68         Stack[0] = 0;
     69         return;
     70     }
     71     if(n == 2)
     72     {
     73         top = 2;
     74         Stack[0] = 0; Stack[1] = 1;
     75         return;
     76     }
     77     Stack[0] = 0; Stack[1] = 1;
     78     top = 2;
     79     for(int i = 2;i < n;i++)
     80     {
     81         while(top > 1 &&
     82         ((list[Stack[top-1]]-list[Stack[top-2]])^(list[i]-list[Stack[top-2]])) <= 0)
     83         top--;
     84         Stack[top++] = i;
     85     }
     86 }
     87 //旋转卡壳,求两点间距离平方的最大值
     88 int rotating_calipers(Point p[],int n)
     89 {
     90     int ans = 0;
     91     Point v;
     92     int cur = 1;
     93     for(int i = 0;i < n;i++)
     94     {
     95         v = p[i]-p[(i+1)%n];
     96         while((v^(p[(cur+1)%n]-p[cur])) < 0)
     97            cur = (cur+1)%n;
     98         ans = max(ans,max(dist2(p[i],p[cur]),dist2(p[(i+1)%n],p[(cur+1)%n])));
     99     }
    100     return ans;
    101 }
    102 Point p[MAXN];
    103 int main()
    104 {
    105     //freopen("in.txt","r",stdin) ;
    106     int n;
    107     while(scanf("%d",&n) == 1)
    108     {
    109         for(int i = 0;i < n;i++)
    110             list[i].input();
    111         Graham(n);
    112         for(int i = 0;i < top;i++)p[i] = list[Stack[i]];
    113         printf("%d
    ",rotating_calipers(p,top));
    114     }
    115     return 0;
    116 }
    View Code
  • 相关阅读:
    mssql 2008 数据库可疑
    sss
    css 浏览器兼容 重置代码
    .net 接口与 foreach必要条件
    .net获取ip
    flash与js的通信
    WebService传输文件的几个知识点
    【前端】深入浅出Javascript中的数值转换
    [前端]代理知识入门介绍
    Hello 博客园! ---致我人生中的第一篇随笔
  • 原文地址:https://www.cnblogs.com/mengchunchen/p/4869851.html
Copyright © 2020-2023  润新知