【BZOJ-1069】最大土地面积 计算几何 + 凸包 + 旋转卡壳
1069: [SCOI2007]最大土地面积
Time Limit: 1 Sec Memory Limit: 128 MB
Submit:
2707 Solved: 1053
[Submit][Status][Discuss]
Description
在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成
的多边形面积最大。
Input
第1行一个正整数N,接下来N行,每行2个数x,y,表示该点的横坐标和纵坐标。
Output
最大的多边形面积,答案精确到小数点后3位。
Sample Input
0 0
1 0
1 1
0 1
0.5
0.5
Sample Output
HINT
数据范围 n<=2000,
|x|,|y|<=100000
Source
Solution
比较裸的一道题,但也有变化之处
比较类似平面最远点对,我们知道所求四边形四个顶点显然存在于凸包上
那么先求一个凸包
那么考虑固定两个点,求以这两点连线为底的第三点分别位于连线上下(左右)的两个三角形,所得到的四边形最大面积
显然对角线可以利用旋转卡壳$O(n)$得到,那么再$O(n)$的枚举另外的第三点,并实时记录答案即可
所以总复杂度为$O(n^{2})$
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int N;
struct Vector
{
double x,y;
Vector (double X=,double Y=) {x=X; y=Y;}
};
typedef Vector Point;
#define MAXN 2010
#define eps 1e-8
Point P[MAXN],ch[MAXN];
Vector operator + (Vector A,Vector B) {return (Vector){A.x+B.x,A.y+B.y};}
Vector operator - (Vector A,Vector B) {return (Vector){A.x-B.x,A.y-B.y};}
Vector operator * (Vector A,double p) {return (Vector){A.x*p,A.y*p};}
Vector operator / (Vector A,double p) {return (Vector){A.x/p,A.y/p};}
bool operator < (const Vector& a,const Vector& b) {return a.x<b.x||(a.x==b.x&&a.y<b.y);}
int dcmp(double x) {if (fabs(x)<eps) return ; return x<? -:;}
double Dot(Vector A,Vector B) {return A.x*B.x+A.y*B.y;}
double Cross(Vector A,Vector B) {return A.x*B.y-A.y*B.x;}
double Len(Vector A) {return sqrt(Dot(A,A));}
double DisTL(Point P,Point A,Point B) {Vector v1=B-A,v2=P-A; return fabs(Cross(v1,v2)/Len(v1));}
double Area(Point A,Point B,Point C) {return Cross(B-A,C-A)/;}
int Graham_ConvexHull(Point *p,int num,Point *ch)
{
sort(p,p+num);
int k,m=;
for (int i=; i<=num-; i++)
{
while (m> && dcmp(Cross(ch[m-]-ch[m-],p[i]-ch[m-]))<=) m--;
ch[m++]=p[i];
}
k=m;
for (int i=num-; i>=; i--)
{
while (m>k && dcmp(Cross(ch[m-]-ch[m-],p[i]-ch[m-]))<=) m--;
ch[m++]=p[i];
}
if (num>) m--;
return m;
}
double Triangle_Area(Point A,Point B,int num)
{
double area1=,area2=;
for (int i=; i<num; i++)
area1=max(area1,Area(ch[i],A,B)),
area2=min(area2,Area(ch[i],A,B));
return area1+(-area2);
}
double Rotating_Calipers(Point *ch,int num)
{
if (num== || num==) return ;
int now=;
double re=;
ch[num]=ch[];
for (int i=; i<num; i++)
{
while (dcmp(DisTL(ch[now],ch[i],ch[i+])-DisTL(ch[now+],ch[i],ch[i+]))<)
now=(now+)%num;
re=max(re,Triangle_Area(ch[i],ch[now],num));
}
return re;
}
int main()
{
scanf("%d",&N);
for (int i=; i<N; i++) scanf("%lf%lf",&P[i].x,&P[i].y);
int m=Graham_ConvexHull(P,N,ch);
double ans=Rotating_Calipers(ch,m);
printf("%.3lf\n",ans);
return ;
}
拿小号交了一下,往删DeBug了WA了一次QAQ结果小号跑得比大号快12MS T^T
【BZOJ-1069】最大土地面积 计算几何 + 凸包 + 旋转卡壳的更多相关文章
- 【BZOJ】1069: [SCOI2007]最大土地面积(凸包+旋转卡壳)
http://www.lydsy.com/JudgeOnline/problem.php?id=1069 显然这四个点在凸包上,然后枚举两个点找上下最大的三角形即可. 找三角形表示只想到三分QAQ.. ...
- BZOJ1069 SCOI2007最大土地面积(凸包+旋转卡壳)
求出凸包,显然四个点在凸包上.考虑枚举某点,再移动另一点作为对角线,容易发现剩下两点的最优位置是单调的.过程类似旋转卡壳. #include<iostream> #include<c ...
- BZOJ1069 [SCOI2007]最大土地面积 【凸包 + 旋转卡壳】
题目链接 BZOJ1069 题解 首先四个点一定在凸包上 我们枚举对角线,剩下两个点分别是两侧最远的点 可以三分,复杂度\(O(n^2logn)\) 可以借鉴旋转卡壳的思想,那两个点随着对角线的一定单 ...
- [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 ...
随机推荐
- 夯实基础之php学习-1基础篇
1,单引号和双引号的区别 单引号表示字符串,双引号能解析字符串中的变量,所以,如果没有变量,尽量用单引号,加快解析速度 当字符串需要单引号或者双引号的时候,可以用转义字符代替 2,类型转换 通过(bo ...
- C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 成熟组件化运行效果分解
1:成熟的组件就是可以写很少的代码,可以实现很多功能.2:又可以用源码方式调用,又可以用dll方式调用.3:不需要学习里面的细节,只要会调用就可以了.4:成熟稳定,功能齐全,bug少,甚至没bug.5 ...
- .NET 4.0 任务(Task)
随着 .NET 4.0的到来,她与以前各版本的一个明显差别就是并行功能的增强,以此来适应这个多核的世界.于是引入了一个新概念---任务,作为支持并行运算的重要组成部分,同时,也作为对线程池的一个补充和 ...
- 使Eclipse符合Java编程规范
编程规范是很重要的东西,能让团队的代码易于阅读和维护,也便于日后的功能扩展. 工欲善其事必先利其器!作为一个Java程序员,与Eclipse打交道可能是一辈子的事情.将Eclipse设置为符合公司编程 ...
- stack overflow错误分析
stack overflow(堆栈溢出)就是不顾堆栈中分配的局部数据块大小,向该数据块写入了过多的数据,导致数据越界,结果覆盖了老的堆栈数据. 或者解释为 在长字符串中嵌入一段代码,并将过程的返回地址 ...
- [转]Windows 8.1删除这台电脑中视频/文档/下载等六个文件夹的方法
Windows 8.1 已将“计算机”正式更名为“这台电脑”,当我们双击打开“这台电脑”后,也会很明显得发现另外一些变化:Windows 8.1 默认将视频.图片.文档.下载.音乐.桌面等常用文件夹 ...
- 使用Python 将shapefile导入mongodb
使用Python 将shapefile导入mongodb 随着big data时代的到来,各个行业都在考虑能不能把big data的思路.方法引入进来,GIS行业也不能免俗. 下面就介绍一下如何将sh ...
- NPOI2.0学习(三)
HSSFWorkbook wk = new HSSFWorkbook();//你用来操作的HSSFWorkbook的实例 ICellStyle cellStyle = wk.CreateCellSty ...
- SEO站点优化学习总结
1.网站收录查询 在搜索引擎里面输入Site:域名 即可. 尾巴——学习SEO可以看看以下几个网站: 卢松松博客[一个草根的博客]:http://lusongsong.com/ 站长之家[里面有站长统 ...
- hello Cookie
Cookie 是什么? Cookie在浏览器中的表现为请求头域和响应头域的字段,也就是伴随着请求和响应的一组键值对的文本.Cookie来源于服务器,第一次请求无Cookie参数,增加Cookie通过服 ...