【BZOJ 1069】 凸包+旋转卡壳
1069: [SCOI2007]最大土地面积
Description
在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成
的多边形面积最大。Input
第1行一个正整数N,接下来N行,每行2个数x,y,表示该点的横坐标和纵坐标。
Output
最大的多边形面积,答案精确到小数点后3位。
Sample Input
5
0 0
1 0
1 1
0 1
0.5 0.5Sample Output
1.000HINT
数据范围 n<=2000, |x|,|y|<=100000
【分析】
这个叫旋转 qia 壳?
好吧,去偷个gif回来。。

其实还是形象生动,旋转卡壳是算点到线段的距离的,就是两条线扫啊扫,有点单调的意思。
这题里,枚举四边形的对角线,然后两边找离这条线段的最远的点,可以证明这些点都是在凸包上的(好像很明显??)
就直接在凸包上找,假设已经枚举了线段x-y,现在枚举x-y+1,卡壳线不断逆时针旋转就可以了(我的打法是逆时针旋转),因为前面去掉的点以后肯定也没有用的,嗯。。
然后,这里要用到平面差积,差积的值是有正负的,所以用差积算面积的时候要小心一点。然后也是用差积比较斜率的。。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
#define Maxn 2010 int n; const double eps=0.000001;
struct P{double x,y;}a[Maxn],c[Maxn];
int len; double mymax(double x,double y) {return x>y?x:y;}
double myabs(double x) {return x<?-x:x;} P operator - (P x,P y)
{
P tt;
tt.x=x.x-y.x;tt.y=x.y-y.y;
return tt;
} int dcmp(double x)
{
if(myabs(x)<eps) return ;
else return x<?-:;
}
bool cmp(P x,P y) {return dcmp(x.x-y.x)==?(x.y<y.y):(x.x<y.x);}
double Dot(P x,P y) {return x.x*y.x+x.y*y.y;}
double Cross(P x,P y) {return x.x*y.y-x.y*y.x;} void chull()
{
sort(a+,a++n,cmp);
len=;
for(int i=;i<=n;i++)
{
while(len>&&Cross(c[len]-c[len-],a[i]-c[len])<=) len--;
c[++len]=a[i];
}
int k=len;
for(int i=n-;i>=;i--)
{
while(len>k&&Cross(c[len]-c[len-],a[i]-c[len])<=) len--;
c[++len]=a[i];
}
len--;
} double ans=;
void RC()//rotating calipers
{
for(int i=;i<=len;i++)
{
int k1=i%len+,k2=(i+)%len+;//两边一起做旋转卡壳
for(int j=i+;j<=len;j++)
{
while(k1%len+!=j&&Cross(c[k1+]-c[i],c[j]-c[i])>Cross(c[k1]-c[i],c[j]-c[i]))
k1=k1%len+;
while(k2%len+!=i&&Cross(c[j]-c[i],c[k2+]-c[i])>Cross(c[j]-c[i],c[k2]-c[i]))
k2=k2%len+;
ans=mymax(ans,Cross(c[j]-c[i],c[k2]-c[i])+Cross(c[k1]-c[i],c[j]-c[i]));
}
}
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%lf%lf",&a[i].x,&a[i].y);
}
chull();
RC();
printf("%.3lf\n",ans/);
return ;
}
2016-12-10 09:44:52
有一篇很好的讲旋转卡壳的博:
【BZOJ 1069】 凸包+旋转卡壳的更多相关文章
- bzoj 1069 凸包+旋转卡壳
题目大意 在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成 的多边形面积最大. 分析 枚举对角线的一个端点 另一个端点开始转 转的时候求出对角线左边面积 ...
- [USACO2003][poj2187]Beauty Contest(凸包+旋转卡壳)
http://poj.org/problem?id=2187 题意:老题了,求平面内最远点对(让本渣默默想到了悲剧的AHOI2012……) 分析: nlogn的凸包+旋转卡壳 附:http://www ...
- UVA 4728 Squares(凸包+旋转卡壳)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=17267 [思路] 凸包+旋转卡壳 求出凸包,用旋转卡壳算出凸包的直 ...
- Code Chef GEOCHEAT(凸包+旋转卡壳+随机化)
题面 传送门 题解 以下记\(S_i=\{1,2,3,...,i\}\) 我们先用凸包+旋转卡壳求出直径的长度,并记直径的两个端点为\(i,j\)(如果有多条直径随机取两个端点) 因为这个序列被\(r ...
- poj 2079 Triangle (二维凸包旋转卡壳)
Triangle Time Limit: 3000MS Memory Limit: 30000KB 64bit IO Format: %I64d & %I64u Submit Stat ...
- poj 2187 Beauty Contest(二维凸包旋转卡壳)
D - Beauty Contest Time Limit:3000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u ...
- POJ 2187 凸包+旋转卡壳
思路: 求个凸包 旋转卡壳一下 就求出来最远点对了 注意共线情况 也就是说 凸包如果有一堆点共线保留端点即可 //By SiriusRen #include <cmath> #incl ...
- 【BZOJ】1069: [SCOI2007]最大土地面积(凸包+旋转卡壳)
http://www.lydsy.com/JudgeOnline/problem.php?id=1069 显然这四个点在凸包上,然后枚举两个点找上下最大的三角形即可. 找三角形表示只想到三分QAQ.. ...
- 【BZOJ 1069】【SCOI 2007】最大土地面积 凸包+旋转卡壳
因为凸壳上对踵点的单调性所以旋转卡壳线性绕一圈就可以啦啦啦--- 先求凸包,然后旋转卡壳记录$sum1$和$sum2$,最后统计答案就可以了 #include<cmath> #includ ...
随机推荐
- PHP学习笔记 - 进阶篇(3)
PHP学习笔记 - 进阶篇(3) 类与面向对象 1.类和对象 类是面向对象程序设计的基本概念,通俗的理解类就是对现实中某一个种类的东西的抽象, 比如汽车可以抽象为一个类,汽车拥有名字.轮胎.速度.重量 ...
- VPN怎么连?
VPN的英文全称是“Virtual Private Network”,翻译过来就是“虚拟专用网络”.VPN是通过特殊的加密的通讯协议在连接在互联网上的位于不同地方的两个或多个内部网之间建立一条专有的通 ...
- javascript 基础API
Math.random() 取值范围[0,1) 大于等于0小于1,包括0,不包括1 Math.floor() 向下取整 Math.ceil() 向上取整 第一题:一组数的规则如下:1.1.2.3. ...
- java集合 collection-list-ArrayList 将自定义对象作为元素存到ArrayList集合中,并去除重复元素。
import java.util.*; /* 将自定义对象作为元素存到ArrayList集合中,并去除重复元素. 比如:存人对象.同姓名同年龄,视为同一个人.为重复元素. 思路: 1,对人描述,将数据 ...
- [java学习笔记]java语言基础概述之转义字符&break&continue
1.转义字符 \t:制表符 \n:回车 \b:退格 \r:回车 \":双引号 \\:反斜线(常用于文件路径的书写中) windows系统中回车符其实是由两个符号组成的,\r\n linu ...
- 【转】DataGridView绑定数据源的几种方式
第一种:DataSet ds=new DataSet (); this.dataGridView1.DataSource=ds.Table[0]; 第二种:DataTable dt=new DataT ...
- NGINX+UWSGI 莫名发生Nginx 502 Bad Gateway错误的排查过程
自己有个阿里云UBUNTU运行的Django站,使用NGINX+UWSGI驱动,今天登陆系统后台更新内容出现了几个大字:Nginx 502 Bad Gateway,一看情况不好,这是要糟糕啊. 啊西八 ...
- Node.js 【使用npm安装一些包失败之笔记】
镜像使用方法(三种办法任意一种都能解决问题,建议使用第三种,将配置写死,下次用的时候配置还在): 1.通过config命令 npm config set registry https://regist ...
- PHP学习之开发工具
刚接触PHP,必然需要一套完整的开发工具.每个语言都有各种各样的编辑工具.采用了相对来说比较了解的Eclipse来作为开发工具. 1.要是用Eclipse需要安装JDK或JRE(Eclipse本身就是 ...
- WPF中让TextBlock每一个字符显示不同的颜色
XAML代码: <TextBlock x:Name="tb"> <Run Foreground="Red">R</Run> ...