poj2187 旋转卡(qia)壳(ke)
题意:求凸包的直径
关于对踵点对、旋转卡壳算法的介绍可以参考这里:
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)的更多相关文章
- BC 2015在百度之星程序设计大赛 - 预赛(1)(矩形区域-旋转卡)
矩形区域 Accepts: 717 Submissions: 1619 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 ...
- POJ 2187: Beauty Contest(旋转卡)
id=2187">Beauty Contest Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 27218 ...
- POJ2187(旋转卡壳)
Beauty Contest Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 35459 Accepted: 10978 ...
- POJ2187 旋转卡壳 求最长直径
给定平面上的一些散点集,求最远两点距离的平方值. 题解: 旋转卡壳求出凸包,然后根据单调性,求出最远两点的最大距离 #pragma GCC optimize(2) #pragma G++ optimi ...
- 3d旋转卡牌
做成向中心缩放就行了,和旋转效果一样的
- [日常摸鱼]POJ2187 BeautyContest-旋转卡壳
原来这个念 旋转卡qia壳ke- 题意:求平面内给定点集里的最远点对,$n \leq 5e4$ 做法就是旋转卡壳啦,话说这题数据范围应该可以再大挺多的. #include<cstdio> ...
- POJ2187 Beauty Contest (旋转卡壳算法 求直径)
POJ2187 旋转卡壳算法如图 证明:对于直径AB 必然有某一时刻 A和B同时被卡住 所以旋转卡壳卡住的点集中必然存在直径 而卡壳过程显然是O(n)的 故可在O(n)时间内求出直径 凸包具有良好的性 ...
- 【BZOJ 1069】 凸包+旋转卡壳
1069: [SCOI2007]最大土地面积 Description 在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成的多边形面积最大. Input 第 ...
- bzoj 1069: [SCOI2007]最大土地面积 凸包+旋转卡壳
题目大意: 二维平面有N个点,选择其中的任意四个点使这四个点围成的多边形面积最大 题解: 很容易发现这四个点一定在凸包上 所以我们枚举一条边再旋转卡壳确定另外的两个点即可 旋(xuan2)转(zhua ...
随机推荐
- 添加Distributor失败
上周做了一个case,客户无法为SQL Server instance配置remote distributor. 下面分享一下排查问题的过程,希望对您排查类似的问题所有帮助. 客户的环境中的SQL S ...
- QT QT练习一
界面中通过三个 QLineEdit控件,一个QPushButton实现+ - * /四则运算,点击pushbutton后将运算结果显示在QLabel控件上. #ifndef WIDGET_H #def ...
- &12 二叉搜索树
#1,定义 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的 ...
- linux:nohup 不生成 nohup.out的方法
nohup java -jar /xxx/xxx/xxx.jar >/dev/null 2>&1 & 关键在于最后的 >/dev/null 2>&1 部 ...
- mac 10.9.4下配置apache
mac 10.9.x已经自带了apache,可按如下步骤开启: 1.启动 sudo apachectl start 启动后,访问 http://localhost/ 应该能看到"It wor ...
- python网络编程学习《一》
最近,刚实习完,很喜欢实验楼,但是自己的方向仍然不能确定,自己觉得可选择的空间很大,尽管已经是大四的人了,想到别人都在忙着买职业装,买高跟鞋面试,学习化妆什么的,看看自己,反而开始慢慢关注运动,食疗以 ...
- 单例模式的两种实现方式对比:DCL (double check idiom)双重检查 和 lazy initialization holder class(静态内部类)
首先这两种方式都是延迟初始化机制,就是当要用到的时候再去初始化. 但是Effective Java书中说过:除非绝对必要,否则就不要这么做. 1. DCL (double checked lockin ...
- 【基础】利用thrift实现一个非阻塞带有回调机制的客户端
假设读者对thrift有一定了解. 客户端有时需要非阻塞的去发送请求,给定服务端一个请求,要求其返回一个计算结果.但是客户端不想等待服务端处理完,而是想发送完这个指令后自己去做其他事情,当结果返回时自 ...
- JS之获取属性总结
嗨,我是沐晴,今天来说说JS中关于获取属性的一些方法和区别.闲话不说,来正题. 首先什么是属性呢,比如input标签,标签中的value id type style等,这些就是属性.我们JS获取属性一 ...
- Hadoop简单安装配置
Hadoop开始设计以Linux平台为运行目标,所以这里推荐在Linux发行版比如Ubuntu进行安装,目前已经有Hadoop for Windows出来,大家自行搜下文章. Hadoop运行模式分为 ...