题意:求凸包的直径

关于对踵点对、旋转卡壳算法的介绍可以参考这里:

http://www.cnblogs.com/Booble/archive/2011/04/03/2004865.html

http://www.cppblog.com/staryjy/archive/2009/11/19/101412.html

http://blog.csdn.net/ACMaker

这里使用了lrj的complex<double>大法来表示复数。

注意别忘了复数乘法的定义:(a+bi)*(c+di)=(ac-bd)+(bc+ad)i

  1 #include <iostream>
  2 #include <complex>
  3 #include <algorithm>
  4 #include <cstdio>
  5 using namespace std;
  6 typedef complex<double> Point;      //Point A:complex   x+yi
  7 typedef Point Vector;
  8 const double eps=1e-10;
  9
 10 int dcmp(double x)      //return  0:x==0  -1:x<0  1:x>0
 11 {
 12     if (fabs(x)<eps)    return 0;
 13         else return x<0?-1:1;
 14 }
 15
 16 bool operator == (const Point &A,const Point &B)
 17 {
 18     double ax=real(A),ay=imag(A),bx=real(B),by=imag(B);
 19     return dcmp(ax-bx)==0 && dcmp(ay-by)==0;
 20 }
 21 /*
 22 bool operator <  (const Point &A,const Point &B)
 23 {
 24     double ax=real(A),ay=imag(A),bx=real(B),by=imag(B);
 25     return ((ax<bx)||(ax==bx && ay<by));
 26 }
 27 */
 28 bool cmp(const Point &A,const Point &B)
 29 {
 30     double ax=real(A),ay=imag(A),bx=real(B),by=imag(B);
 31     //return ((ax<bx)||(ax==bx && ay<by));
 32     int dx=dcmp(ax-bx),dy=dcmp(ay-by);   //return  0:ax==bx  -1:ax<bx  1:ax>bx
 33     return ((dx==-1)||((dx==0)&&(dy==-1)));
 34 }
 35
 36
 37 double Dot(Vector A,Vector B)        //Ax*Bx+Ay*By
 38 {
 39     return real(conj(A)*B);
 40 }
 41
 42 double Cross(Vector A,Vector B)     //Ax*By-Ay*Bx
 43 {
 44     return imag(conj(A)*B);
 45 }
 46
 47 Vector Rotate(Vector A,double rad)
 48 {
 49     return A*exp(Point(0,rad));
 50 }
 51
 52 double Dist(Point A,Point B)        //distance^2
 53 {
 54     double ax=real(A),ay=imag(A),bx=real(B),by=imag(B);
 55     //cout<<ax<<" "<<ay<<" "<<bx<<" "<<by<<" "<<(ax-bx)*(ax-bx)+(ay-by)*(ay-by)<<endl;
 56     return ((ax-bx)*(ax-bx)+(ay-by)*(ay-by));
 57 }
 58
 59 double PolygonArea(Point *p,int n)
 60 {
 61     double area=0;
 62     for (int i=1;i<n-1;i++)
 63         area+=Cross(p[i]-p[0],p[i+1]-p[0]);
 64     return area/2;
 65 }
 66
 67 int convexhull(Point *p,int n,Point *ch)
 68 {
 69     sort(p,p+n,cmp);
 70     int m=0;
 71     for (int i=0;i<n;i++)
 72     {
 73         while (m>1 && Cross(ch[m-1]-ch[m-2],p[i]-ch[m-2])<=0)
 74             m--;
 75         ch[m++]=p[i];
 76     }
 77     int k=m;
 78     for (int i=n-2;i>=0;i--)
 79     {
 80         while (m>k && Cross(ch[m-1]-ch[m-2],p[i]-ch[m-2])<=0)
 81             m--;
 82         ch[m++]=p[i];
 83     }
 84     if (n>1)    m--;
 85     return m;
 86 }
 87
 88 double rotating_calipers(Point *ch,int num)
 89 {
 90     int q=1;
 91     double ans=0;
 92     ch[num]=ch[0];
 93     for(int p=0;p<num;p++)
 94     {
 95         while(Cross(ch[p+1]-ch[p],ch[q+1]-ch[p])>Cross(ch[p+1]-ch[p],ch[q]-ch[p]))
 96             q=(q+1)%num;
 97         ans=max(ans,max(Dist(ch[p],ch[q]),Dist(ch[p+1],ch[q+1])));
 98     }
 99     return ans;
100 }
101
102 Point p[51000],ch[51000];
103 int n,x,y;
104
105 int main()
106 {
107     //freopen("in.txt","r",stdin);
108     //freopen("ou.txt","w",stdout);
109
110     while (cin>>n)
111     {
112         for (int i=0;i<n;i++)
113         {
114             cin>>x>>y;
115             p[i]=Point(x,y);
116         }
117
118         int num=convexhull(p,n,ch);
119         int ans=rotating_calipers(ch,num);
120
121         //cout<<num<<" "<<ans<<endl;
122
123         cout<<ans<<endl;
124     }
125     return 0;
126 }

View Code

发现一个下载USACO Contest数据的好地方:http://iskren.info/tasks/USACO/

转载于:https://www.cnblogs.com/pdev/p/4265803.html

poj2187 旋转卡(qia)壳(ke)相关推荐

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

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

  2. Css动画效果旋转卡牌

    这次我们来实现一个用css动画效果敲打出来一个旋转卡牌的小案列. 首先把img图片框架敲打出来,给它一个div标签,里面包裹六个img标签. 放进去图片之后,然后给图片设置一下css样式. 设置tra ...

  3. 旋转卡(qia)壳 平面最远点对

    这个标题我以前一直读错... 旋转卡壳最基本应用便是求平面最远点对,被一对卡壳正好卡住的对应点对称为对踵点(Antipodal point),这里有一个结论,最远点对必然属于对踵点集. 引用别人的证明 ...

  4. poj 2187 凸包or旋转qia壳法

    题意: 给n(50000)个点,求这些点与点之间距离最大的距离. 解析: 先求凸包然后暴力. 或者旋转卡壳大法. 代码: #include <iostream> #include < ...

  5. BC 2015在百度之星程序设计大赛 - 预赛(1)(矩形区域-旋转卡)

    矩形区域 Accepts: 717 Submissions: 1619 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 ...

  6. ACM算法总结 平面几何

    基础知识 像一些点.向量.点乘.叉乘.圆等等知识,应该都是最基本的平面几何知识,这里就不再赘述,主要考虑如何实现这些平面几何的运算. 首先是定义一些常量和宏定义: #define RAD(x) (pi ...

  7. HDUOJ 1392凸包graham算法

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  8. 轮廓中对踵点/旋转卡壳

    最近遇到需要求图形轮廓中距离最远的点,即长轴. 网上查了一些资料,思路如下. 1. 利用OpenCV提取图形的轮廓点. 2. 把提取到的所有轮廓点当做一个集合,再次提取最外面的轮廓. 3. 用凸包旋转 ...

  9. solr 6.1.0 的配置及简单使用

    2019独角兽企业重金招聘Python工程师标准>>> 第一部分 配置部分 jdk 1.8  +  solr 6.1.0 + php扩展 2.4.0 jdk路径:   /usr/lo ...

最新文章

  1. 编写你的第一个 Flutter App
  2. Android自定义旋钮效果,Android自定义悬浮按钮效果实现,带移动效果
  3. linux 内核 ntfs,Linux大脑 内核 内核编译(NTFS)
  4. muduo网络库学习(三)定时器TimerQueue的设计
  5. Python——Django框架——Model数据库模型
  6. 前端学习(786):数组创建的两种方式
  7. Linux关闭Tomcat服务器出现无法关闭 :8005端口未启动
  8. Iocomp .net仿真仪表控件包
  9. Android中关于Volley的使用(一)加载图片
  10. weblogic登录验证被拒绝_腾讯游戏:疑似未成年人登录和支付时需人脸识别验证...
  11. 2019年终总结,一朝看尽长安花
  12. ios10怎么设置电池颜色_IOS10秘籍:如何调整降低白点值让屏幕更暗
  13. 只要两步,用Python将地址标记在地图上!
  14. cmd查看历史操作命令
  15. 手工命令行打包java工程为war包
  16. 深度学习的权重衰减是什么_权重衰减和L2正则化是一个意思吗?它们只是在某些条件下等价...
  17. 多功能的U盘启动盘制作工具
  18. 熊掌号能否撑起SEO的蓝天?
  19. 重视ERP系统运行的潜在风险
  20. nbtscan之类的SMB枚举工具用法

热门文章

  1. [20190727NOIP模拟测试9]单(single) 题解(树上dp)
  2. JAVA作业三:教练与运动员案例
  3. VMI管理常见的业务场景(一)
  4. 在图片上添加文字并生成图片
  5. c++实验总结_史上最全场景文字检测资源合集(70篇重要论文 + 15个开源代码 + 176个实验结果 + 1305个统计信息)...
  6. python类的实例化和继承
  7. 获取今日头条街拍图片
  8. 微信第三方授权生成二维码api
  9. 码市coding不能下载
  10. Ubuntu下VSCode调试C++程序以及opencv库和Qt5库