题意:求凸包的直径

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

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

 #include <iostream>
#include <complex>
#include <algorithm>
#include <cstdio>
using namespace std;
typedef complex<double> Point; //Point A:complex x+yi
typedef Point Vector;
const double eps=1e-; int dcmp(double x) //return 0:x==0 -1:x<0 1:x>0
{
if (fabs(x)<eps) return ;
else return x<?-:;
} bool operator == (const Point &A,const Point &B)
{
double ax=real(A),ay=imag(A),bx=real(B),by=imag(B);
return dcmp(ax-bx)== && dcmp(ay-by)==;
}
/*
bool operator < (const Point &A,const Point &B)
{
double ax=real(A),ay=imag(A),bx=real(B),by=imag(B);
return ((ax<bx)||(ax==bx && ay<by));
}
*/
bool cmp(const Point &A,const Point &B)
{
double ax=real(A),ay=imag(A),bx=real(B),by=imag(B);
//return ((ax<bx)||(ax==bx && ay<by));
int dx=dcmp(ax-bx),dy=dcmp(ay-by); //return 0:ax==bx -1:ax<bx 1:ax>bx
return ((dx==-)||((dx==)&&(dy==-)));
} double Dot(Vector A,Vector B) //Ax*Bx+Ay*By
{
return real(conj(A)*B);
} double Cross(Vector A,Vector B) //Ax*By-Ay*Bx
{
return imag(conj(A)*B);
} Vector Rotate(Vector A,double rad)
{
return A*exp(Point(,rad));
} double Dist(Point A,Point B) //distance^2
{
double ax=real(A),ay=imag(A),bx=real(B),by=imag(B);
//cout<<ax<<" "<<ay<<" "<<bx<<" "<<by<<" "<<(ax-bx)*(ax-bx)+(ay-by)*(ay-by)<<endl;
return ((ax-bx)*(ax-bx)+(ay-by)*(ay-by));
} double PolygonArea(Point *p,int n)
{
double area=;
for (int i=;i<n-;i++)
area+=Cross(p[i]-p[],p[i+]-p[]);
return area/;
} int convexhull(Point *p,int n,Point *ch)
{
sort(p,p+n,cmp);
int m=;
for (int i=;i<n;i++)
{
while (m> && Cross(ch[m-]-ch[m-],p[i]-ch[m-])<=)
m--;
ch[m++]=p[i];
}
int k=m;
for (int i=n-;i>=;i--)
{
while (m>k && Cross(ch[m-]-ch[m-],p[i]-ch[m-])<=)
m--;
ch[m++]=p[i];
}
if (n>) m--;
return m;
} double rotating_calipers(Point *ch,int num)
{
int q=;
double ans=;
ch[num]=ch[];
for(int p=;p<num;p++)
{
while(Cross(ch[p+]-ch[p],ch[q+]-ch[p])>Cross(ch[p+]-ch[p],ch[q]-ch[p]))
q=(q+)%num;
ans=max(ans,max(Dist(ch[p],ch[q]),Dist(ch[p+],ch[q+])));
}
return ans;
} Point p[],ch[];
int n,x,y; int main()
{
//freopen("in.txt","r",stdin);
//freopen("ou.txt","w",stdout); while (cin>>n)
{
for (int i=;i<n;i++)
{
cin>>x>>y;
p[i]=Point(x,y);
} int num=convexhull(p,n,ch);
int ans=rotating_calipers(ch,num); //cout<<num<<" "<<ans<<endl; cout<<ans<<endl;
}
return ;
}

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

poj2187 旋转卡(qia)壳(ke)的更多相关文章

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

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

  2. POJ 2187: Beauty Contest(旋转卡)

    id=2187">Beauty Contest Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 27218   ...

  3. POJ2187(旋转卡壳)

    Beauty Contest Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 35459   Accepted: 10978 ...

  4. POJ2187 旋转卡壳 求最长直径

    给定平面上的一些散点集,求最远两点距离的平方值. 题解: 旋转卡壳求出凸包,然后根据单调性,求出最远两点的最大距离 #pragma GCC optimize(2) #pragma G++ optimi ...

  5. 3d旋转卡牌

    做成向中心缩放就行了,和旋转效果一样的

  6. [日常摸鱼]POJ2187 BeautyContest-旋转卡壳

    原来这个念 旋转卡qia壳ke- 题意:求平面内给定点集里的最远点对,$n \leq 5e4$ 做法就是旋转卡壳啦,话说这题数据范围应该可以再大挺多的. #include<cstdio> ...

  7. POJ2187 Beauty Contest (旋转卡壳算法 求直径)

    POJ2187 旋转卡壳算法如图 证明:对于直径AB 必然有某一时刻 A和B同时被卡住 所以旋转卡壳卡住的点集中必然存在直径 而卡壳过程显然是O(n)的 故可在O(n)时间内求出直径 凸包具有良好的性 ...

  8. 【BZOJ 1069】 凸包+旋转卡壳

    1069: [SCOI2007]最大土地面积 Description 在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成的多边形面积最大. Input 第 ...

  9. bzoj 1069: [SCOI2007]最大土地面积 凸包+旋转卡壳

    题目大意: 二维平面有N个点,选择其中的任意四个点使这四个点围成的多边形面积最大 题解: 很容易发现这四个点一定在凸包上 所以我们枚举一条边再旋转卡壳确定另外的两个点即可 旋(xuan2)转(zhua ...

随机推荐

  1. codevs2806 红与黑

    难度等级:白银 codevs2806 红与黑 题目描述 Description 有一个矩形房间,覆盖正方形瓷砖.每块瓷砖涂成了红色或黑色.一名男子站在黑色的瓷砖上,由此出发,可以移到四个相邻瓷砖之一, ...

  2. hadoop 2.6伪分布安装

    hadoop 2.6的“伪”分式安装与“全”分式安装相比,大部分操作是相同的,主要区别在于不用配置slaves文件,而且其它xxx-core.xml里的参数很多也可以省略,下面是几个关键的配置: (安 ...

  3. 使用Spring Sleuth和Zipkin跟踪微服务

    随着微服务数量不断增长,需要跟踪一个请求从一个微服务到下一个微服务的传播过程, Spring Cloud Sleuth 正是解决这个问题,它在日志中引入唯一ID,以保证微服务调用之间的一致性,这样你就 ...

  4. closure!

    总结一下闭包. 闭包的定义:当一个内部函数被其外部函数之外的变量所引用时,就形成了一个闭包. 一个最简单的闭包: function A(){ var count=0; return function( ...

  5. js的Array的map和sort实现方法

    Array.prototype.mapA = function(fun /*, thisp*/) { var len = this.length; if (typeof fun != "fu ...

  6. 关于图像文章垂直无缝连接滚动——JS实现

    <!-- 作者:chenyehuacecil@163.com 时间:2015-02-04 描述:实现整篇文章从下到上的无缝连接滚动--><html xmlns="http: ...

  7. 桔子浏览器|1M安装包|hao123专属浏览器

    桔子浏览器是百度为好123打造的首页导航浏览器,体积小.为老年机上网提供便利. 免费下载:http://yunpan.cn/cmKbYXamEVUiY  访问密码 d270

  8. 什么是smarty?

    什么是smarty? Smarty是一个使用PHP写出来的模板PHP模板引擎,由PHP.net官方提供 ,它提供了逻辑与外在内容的分离,简单的讲,目的就是要使用PHP程 序员同美工分离,使用的程序员改 ...

  9. Tomcat6查看数据库的数据源信息

    打开tomcat6\conf  下的 context.xml

  10. 从库查看状态的时候显示“ Last_Error”

    mysql> show slave status\G;*************************** 1. row ***************************         ...