http://poj.org/problem?id=2187

题意:

最长的点对近距离的平方:

题解:

旋转卡壳法, 要注意的地方是,有 所有点共线的情况,所以,(求凸包时)要将,共线点去出 ;

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<cmath>
  4 #include<iostream>
  5 #include<algorithm>
  6 #include<set>
  7 #include<map>
  8 #include<queue>
  9 #include<vector>
 10 #include<string>
 11 #define Min(a,b) a<b?a:b
 12 #define Max(a,b) a>b?a:b
 13 #define CL(a,num) memset(a,num,sizeof(a));
 14 #define maxn  50100
 15 #define eps  1e-12
 16 #define inf 100000000
 17 #define mx 1<<60
 18 #define ll   __int64
 19 const double pi  = acos(-1.0);
 20 using namespace std;
 21 struct point
 22 {
 23     double x,y;
 24 }p[maxn];
 25 point stack[maxn];
 26 int dblcmp(double x)
 27 {
 28     if(fabs(x) < eps) return 0;
 29     if(x < 0) return -1;
 30     else return 1;
 31 }
 32 double det(double x1,double y1,double x2,double y2)
 33 {
 34     return x1*y2 - x2*y1 ;
 35 }
 36 double cross(point a, point b, point c)
 37 {
 38     return det(b.x - a.x, b.y - a.y, c.x - a.x, c.y - a.y);
 39 }
 40 int cmp(point a,point b)
 41 {
 42     if(a.y != b.y) return a.y < b.y;
 43     else return a.x < b.x;
 44 }
 45 int  top ,n;
 46 void graham()
 47 {
 48 
 49     int  i,len;
 50     top = 0;
 51     sort(p,p+n,cmp);
 52 
 53     if(n == 0) return ;
 54     if(n == 1) return ;
 55     stack[top++] = p[0];
 56     stack[top++] = p[1];
 57     for(i = 2 ;i<n;i++)//求右链
 58     {
 59         while(top > 1&& cross(stack[top - 1],stack[top - 2],p[i]) >= 0) top--;
 60 
 61         stack[top++] = p[i];
 62     }
 63 
 64      //dblcmp(cross(p[stack[top - 1]],p[stack[top - 2]],p[i])) 可以直接是 cross
 65     len =  top ;
 66 
 67     for(i = n - 2;i >= 0;i--)//求左链
 68     {
 69          while(top > len && cross(stack[top - 1],stack[top - 2],p[i]) >= 0)top--;
 70          stack[top++] = p[i];
 71 
 72     }
 73     top--;//第一个点入栈两次 所以 减 1
 74 
 75 }
 76 double dis(point a,point b)
 77 {
 78   double x1 = a.x;
 79   double y1 = a.y;
 80   double x2 = b.x;
 81   double y2 = b.y;
 82   return (x1 - x2)*(x1 - x2)+ (y1 - y2)*(y1 - y2);
 83 }
 84 double  rotating_calipers(point stack[],int top)
 85 {
 86     int i;
 87     int q  = 1;
 88     double ans = 0;
 89    stack[top] = stack[0] ;
 90 
 91 
 92    for(i = 0;i < top;i++ )
 93    {
 94        while(cross(stack[i+1],stack[q+1],stack[i]) > cross(stack[i + 1],stack[q],stack[i]))
 95         q = (q+1)%top;
 96 
 97 
 98 
 99        ans = max(ans,max(dis(stack[i],stack[q]),dis(stack[i+1],stack[q+1])));
100 
101    }
102    return ans ;
103 }
104 int main()
105 {
106 
107 
108       int  i,s,j;
109     //freopen("data.txt","r",stdin);
110     while(scanf("%d",&n)!=EOF)
111     {
112         for(i = 0;i< n;i++)
113         {
114             scanf("%lf%lf",&p[i].x,&p[i].y);
115         }
116         graham() ;
117 
118        double ans = rotating_calipers(stack,top);
119        printf("%.0lf\n",ans);
120 
121 
122     }
123 }

转载于:https://www.cnblogs.com/acSzz/archive/2012/08/28/2660509.html

poj 2187 Beauty Contest (凸包: 最远点对,最长直径 , 旋转卡壳法)相关推荐

  1. poj 2187 Beauty Contest(凸包求解多节点的之间的最大距离)

    1 /* poj 2187 Beauty Contest 2 凸包:寻找每两点之间距离的最大值 3 这个最大值一定是在凸包的边缘上的! 4 5 求凸包的算法: Andrew算法! 6 */ 7 #in ...

  2. POJ - 2187 Beauty Contest(最远点对)

    http://poj.org/problem?id=2187 题意 给n个坐标,求最远点对的距离平方值. 分析 模板题,旋转卡壳求求两点间距离平方的最大值. #include<iostream& ...

  3. POJ - 2187 Beauty Contest (求距离最远点对-凸包+旋转卡壳/枚举 (旋转卡壳学习))

    链接:https://vjudge.net/problem/POJ-2187 题意:求求距离最远点对. 思路:肯定为凸包上的点,可枚举,也可根据凸包性质旋转卡壳求对踵点. 参考博客: https:// ...

  4. POJ 2187 Beauty Contest( 凸包求最远点对 )

    链接:传送门 题意:给出 n 个点,求出这 n 个点中最远的两个点距离的平方 思路:最远点对一定会在凸包的顶点上,然后直接暴力找一下凸包顶点中距离最远的两个点 /******************* ...

  5. poj 2187 Beauty Contest

    http://poj.org/problem?id=2187 题意:给你n个坐标点 ,求两点之间的最大距离的平方 题解:求出凸包,枚举顶点两两之间的距离 #include<cstdio> ...

  6. [Poj 2187] 计算几何之凸包(二) {更高效的算法}

    { 承上一节 继续介绍点集的凸包  (下文中所有凸包 若不做特殊说明均指点集的凸包) 这一节介绍相比更高效的算法 } ========================================= ...

  7. POJ2187 Beauty Contest(凸包+对踵点对求解)

    思路:求凸包,然后旋转卡壳对最远点对求解,注意凸包退化的情况 #include<cstdio> #include<cstring> #include<cmath> ...

  8. 凸包 初学 Andrew 和 Melkman (模板) 旋转卡(qia)壳(ke)

    凸包初学 定义: 给你n个散落的点,让你求出最小的凸多边形将所有的点包括起来,或者点在边上. 稳定凸包,不能再扩充,每条边都用3个点 必备知识: 会用叉积判断点与直线的关系(这里指 点在线的那一边, ...

  9. 旋转卡壳凸包(不用一下子就学完所有)

    目录 前言 参考博客 前置知识 1.极角排序 2.凸包(默认逆时针) 3.对踵点 旋转卡壳能解决的各类问题 1.计算距离 1.1凸多边形直径 1.2凸多边形宽 1.3凸多边形间最大距离 1.4凸多边形 ...

最新文章

  1. java 登录按钮响应数据库_用户登录功能的实现—从前端到后台(包括数据库)...
  2. PostgreSQL字符串截取替换
  3. ckeditor和ckfinder的使用
  4. 配置云服务器 FTP 服务
  5. 计算机表演赛新疆赛区,【图】第二十六届中国儿童青少年威盛中国芯HTC计算机表演赛“中国电信天翼杯”新疆赛区总决赛圆满结束_乌鲁木齐教育信息网...
  6. 【VMware vSAN 6.6】5.5.Update Manager:vSAN硬件服务器解决方案
  7. 【Java】浅谈JavaDoc文档注释
  8. EXTRONICS推出IRFID500便携式UHF RFID读写器
  9. 格式化字符串漏洞利用 二、格式化函数
  10. UIWebView 真机iOS 8.x系统上报错
  11. CString类简介
  12. 在IIS上部署.net core的webapi项目 以及502.5错误的两种解决方法
  13. Java练习例子:计算圆柱体积
  14. WPS使用VB批量将多个sheet单独存储为xls文件
  15. Lync/Skype脱机地址簿不更新
  16. 【回炉重造】带你搞懂什么是机器学习?
  17. list过滤重复数据java_java中List去除重复数据的五种方式
  18. 世界崩塌前要写下游戏心得(持续更新)
  19. 计算机网络体系结构整理-第二单元IP技术
  20. 软件测试人还知道大名鼎鼎的compuware性能调优工具吗?该公司撤离中国!

热门文章

  1. ubuntu创建文件夹和删除文件
  2. mysql thread入门分析
  3. BZOJ 1305 dance跳舞(最大流+二分答案)
  4. angularjs 添加拦截器
  5. 如何制作Windows镜像
  6. Node.js基本讲解
  7. winfrom水晶报表的创建
  8. arp 不同网段 相同vlan_三层交换机,相同的网段,不同的VLAN ,怎么通信?
  9. 网站重启服务器有啥好处,常规服务器重启的好处和障碍
  10. matlab while 跳出,请帮忙看下这个程序为什么跳不出WHILE循环??