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.5

Sample Output

1.000

HINT

数据范围 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


有一篇很好的讲旋转卡壳的博:

http://blog.csdn.net/hanchengxi/article/details/8639476

【BZOJ 1069】 凸包+旋转卡壳的更多相关文章

  1. bzoj 1069 凸包+旋转卡壳

    题目大意 在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成 的多边形面积最大. 分析 枚举对角线的一个端点 另一个端点开始转 转的时候求出对角线左边面积 ...

  2. [USACO2003][poj2187]Beauty Contest(凸包+旋转卡壳)

    http://poj.org/problem?id=2187 题意:老题了,求平面内最远点对(让本渣默默想到了悲剧的AHOI2012……) 分析: nlogn的凸包+旋转卡壳 附:http://www ...

  3. UVA 4728 Squares(凸包+旋转卡壳)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=17267 [思路] 凸包+旋转卡壳 求出凸包,用旋转卡壳算出凸包的直 ...

  4. Code Chef GEOCHEAT(凸包+旋转卡壳+随机化)

    题面 传送门 题解 以下记\(S_i=\{1,2,3,...,i\}\) 我们先用凸包+旋转卡壳求出直径的长度,并记直径的两个端点为\(i,j\)(如果有多条直径随机取两个端点) 因为这个序列被\(r ...

  5. poj 2079 Triangle (二维凸包旋转卡壳)

    Triangle Time Limit: 3000MS   Memory Limit: 30000KB   64bit IO Format: %I64d & %I64u Submit Stat ...

  6. poj 2187 Beauty Contest(二维凸包旋转卡壳)

    D - Beauty Contest Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u ...

  7. POJ 2187 凸包+旋转卡壳

    思路: 求个凸包 旋转卡壳一下 就求出来最远点对了 注意共线情况 也就是说   凸包如果有一堆点共线保留端点即可 //By SiriusRen #include <cmath> #incl ...

  8. 【BZOJ】1069: [SCOI2007]最大土地面积(凸包+旋转卡壳)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1069 显然这四个点在凸包上,然后枚举两个点找上下最大的三角形即可. 找三角形表示只想到三分QAQ.. ...

  9. 【BZOJ 1069】【SCOI 2007】最大土地面积 凸包+旋转卡壳

    因为凸壳上对踵点的单调性所以旋转卡壳线性绕一圈就可以啦啦啦--- 先求凸包,然后旋转卡壳记录$sum1$和$sum2$,最后统计答案就可以了 #include<cmath> #includ ...

随机推荐

  1. 抽象类[abstract]_C#

    抽象类(abstract) abstract修饰符可以和类.方法.属性.索引器及事件一起使用.在类声明中使用abstract修饰符以指示某个类只能是其它类的基类.标记为抽象或包含在抽象类中的成员必须通 ...

  2. JSON-lib框架,JAVA对象与JSON、XML之间的相互转换

    Json-lib可以将Java对象转成json格式的字符串,也可以将Java对象转换成xml格式的文档,同样可以将json字符串转换成Java对象或是将xml字符串转换成Java对象. 一. 准备工作 ...

  3. HTML5之 WebWorkers

    为了进行后台计算提供的完全隔离计算方式 不可访问 DOM APIs 不可访问 window object 不可访问 document object 强隔离保证并行计算结果无误(无锁机制) ---- 启 ...

  4. 使用thinkPHP框架实现删除和批量删除一例【原创】

    本文为作者原创,转载请注明原作者及转载地址. 上一篇讲了如何用thinkPHP框架实现数据的添加,那这一篇就讲一下如何用thinkPHP实现数据的删除和批量删除吧. 预期效果图: 原谅博主对照片的处理 ...

  5. spring 计划任务:cron表达式

    Cron表达式是一个字符串,字符串以5或6个空格隔开,分开工6或7个域,每一个域代表一个含义,Cron有如下两种语法 格式: Seconds Minutes Hours DayofMonth Mont ...

  6. style、currentStyle、getComputedStyle区别介绍

    style.currentStyle.getComputedStyle区别介绍 来自:蓝色天空 样式表有三种方式 内嵌样式(inline Style) :是写在Tag里面的,内嵌样式只对所有的Tag有 ...

  7. 【转】c#文件操作大全(二)

    61.文件夹移动到整合操作 FolderDialog aa = new FolderDialog();            aa.DisplayDialog();            if (aa ...

  8. python学习之js从0开始

    <html> <head> <title>js页面</title> <script src="js/old_boy.js"&g ...

  9. (转)Qt Model/View 学习笔记 (六)——在views中选择数据项

    在views中选择数据项 概念 用于新的view类中的选择模型比Qt3中的模型有了很大的改进.它为基于model/view架构的选择提供了更为全面的描述.尽管对提供了的views来说,负责操纵选择的标 ...

  10. MySQL创建数据库[保存mojo格式的数据库]已经常用的utf8格式数据库

    一.创建最新编码utf8mb4格式的库: CREATE DATABASE IF NOT EXISTS yourdbname CHARACTER SET utf8mb4 COLLATE utf8mb4_ ...