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 ...
随机推荐
- Linux 信号详解五(信号阻塞,信号未决)
信号在内核中的表示 执行信号的处理动作成为信号递达(Delivery),信号从产生到递达之间的状态称为信号未决(Pending).进程可以选择阻塞(Block)某个信号. 被阻塞的信号产生时将保持在未 ...
- 利用writing-mode实现元素的垂直居中
writing-mode是CSS3的新特性之一,使用场景不是很多.这个属性主要是改变文档流的显示方式.具体的介绍参考这篇文章:http://www.zhangxinxu.com/wordpress/2 ...
- .NET MVC AjaxHelper
我们首先必须开启 非入侵式 Ajax:导入Jquery和unobtrusiveAjax文件 已经默认开启客户端验证 和 非侵入式js <add key="ClientValidatio ...
- AndFix热修复 —— 实战与源码解析
当你的应用发布后第二天却发现一个重要的bug要修复,头疼的同时你可能想着赶紧修复重新打个包发布出去,让用户收到自动更新重新下载.但是万事皆有可能,万一隔一天又发现一个急需修复的bug呢?难道再次发布打 ...
- 项目规范性检测工具Lint
项目规范性检测工具lint.bat 一.Lint基本概念介绍 Android Lint是SDK Tools 16 (ADT 16)之后才引入的工具,通过它对Android工程源代码进行扫描和检查,可发 ...
- Bootstrap系列 -- 7. 列表排版方式
一. 去点列表 1. 使用class=list-unstyled <ul > <li>无序列表项目</li> <li>无序列表项目</li> ...
- [POJ3696]The Luckiest number(数论)
题目:http://poj.org/problem?id=3696 题意:给你一个数字L,你要求出一个数N,使得N是L的倍数,且N的每位数都必须是8,输出N的位数(如果不存在输出0) 分析: 首先我们 ...
- UEFI与MBR区别
EFI与MBR启动的区别 大硬盘和WIN8系统,让我们从传统的BIOS+MBR模式升级到UEFI+GPT模式,现在购买的主流电脑,都是预装WIN8系统,为了更好的支持2TB硬盘 ,更快速的启动win ...
- Bete冲刺第三阶段
Bete冲刺第三阶段 今日工作: web: 检索了各类资料,今日暂时顺利解决了hibernate懒加载异常的问题,采用的凡是也比较简单就是添加了一个OpenSessionInViewFilter的过滤 ...
- Java--笔记(1)
1.Swing 是在AWT的基础上构建的一套新的图形界面系统,它提供了AWT 所能够提供的所有功能,并且用纯粹的Java代码对AWT 的功能进行了大幅度的扩充.AWT 是基于本地方法的C/C++程序, ...