bzoj 1069 凸包+旋转卡壳
题目大意
在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成
的多边形面积最大。
分析
枚举对角线的一个端点
另一个端点开始转
转的时候求出对角线左边面积最大的三角形,右边面积最大的三角形
三角形面积\(=\)对角线长度\(*\)高
高\(=\)两条平行线间任意两点距离
过对角线做两条平行线,对着凸包夹一夹
可以发现这实际上就是一个旋转卡壳
\(O(n^2)\)
solution
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <algorithm>
typedef long double db ;
using namespace std;
const int M=2007;
struct pt{
db x,y;
pt(db xx=0.0,db yy=0.0){x=xx;y=yy;}
}p[M],s[M];
pt operator -(pt x,pt y){return pt(x.x-y.x,x.y-y.y);}
pt operator +(pt x,pt y){return pt(x.x+y.x,x.y+y.y);}
bool operator <(pt x,pt y){if(x.y!=y.y)return x.y<y.y; return x.x<y.x;}
db cross(pt x,pt y){
return x.x*y.y-x.y*y.x;
}
db dot(pt x,pt y){
return x.x*y.x+x.y*y.y;
}
db area(pt x,pt y,pt z){
return cross(y-x,z-x);
}
db length(pt x){
return sqrt(dot(x,x));
};
db shadow(pt x,pt to){
return dot(x,to)/length(to);
}
bool cmp(pt x,pt y){//ÄæÊ±Õ뼫½ÇÅÅÐò
db tp=area(p[1],x,y);
if(tp==0) return length(x-p[1])<length(y-p[1]);
return tp>0;
}
int n;
int tot;
void convex(){
int ii=1,i;
for(i=1;i<=n;i++) if(p[i]<p[ii]) ii=i;
swap(p[1],p[ii]);
sort(p+2,p+n+1,cmp);
s[tot=1]=p[1];
for(i=2;i<=n;i++){
while(tot>1&&area(s[tot-1],s[tot],p[i])<=0) tot--;// <=
s[++tot]=p[i];
}
}
int main(){
int i,j,k,p1,p2;
db x,y;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%Lf%Lf",&x,&y);
p[i]=pt(x,y);
}
convex();
db ans=0;
for(i=1;i<tot;i++){
p1=i,p2=i+1;
for(j=i+1;j<=tot;j++){
while(area(s[i],s[p1],s[j])<area(s[i],s[p1%tot+1],s[j])) p1=p1%tot+1;
while(area(s[i],s[j],s[p2])<area(s[i],s[j],s[p2%tot+1])) p2=p2%tot+1;
ans=max(ans,area(s[i],s[p1],s[j])+area(s[i],s[j],s[p2]));
}
}
printf("%.3Lf\n",ans/2.0);
return 0;
}
bzoj 1069 凸包+旋转卡壳的更多相关文章
- [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】 凸包+旋转卡壳
1069: [SCOI2007]最大土地面积 Description 在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成的多边形面积最大. Input 第 ...
- 【BZOJ 1069】【SCOI 2007】最大土地面积 凸包+旋转卡壳
因为凸壳上对踵点的单调性所以旋转卡壳线性绕一圈就可以啦啦啦--- 先求凸包,然后旋转卡壳记录$sum1$和$sum2$,最后统计答案就可以了 #include<cmath> #includ ...
随机推荐
- DROP LANGUAGE - 删除一个过程语言
SYNOPSIS DROP [ PROCEDURAL ] LANGUAGE name [ CASCADE | RESTRICT ] DESCRIPTION 描述 DROP LANGUAGE 将删除曾注 ...
- javaweb基础(6)_servlet配置参数
一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些 ...
- 【windows】【md5】查看文件的md5值
certutil -hashfile filename MD5 certutil -hashfile filename SHA1 certutil -hashfile filename SHA256 ...
- 使用nohup+& 踩到的坑
首先分清楚nohup与&: &是指在后台运行一般在执行命令后,都会显式的在前台执行,当Ctrl+C后进程回宕掉,但是 在命令后加&,即使Ctrl+C,程序还在进行,但是,当关闭 ...
- atag信息处理
machine_desc->boot_params参数保存的是u-boot传入的启动参数的地址,如果没有传入启动参数,使用如下的默认参数: /* * This holds our default ...
- PAT Basic 1073
1073 多选题常见计分法 批改多选题是比较麻烦的事情,有很多不同的计分方法.有一种最常见的计分方法是:如果考生选择了部分正确选项,并且没有选择任何错误选项,则得到 50% 分数:如果考生选择了任何一 ...
- Python之code对象与pyc文件(三)
上一节:Python之code对象与pyc文件(二) 向pyc写入字符串 在了解Python如何将字符串写入到pyc文件的机制之前,我们先来了解一下结构体WFILE: marshal.c typede ...
- fiddler 抓包数据不会自动下拉解决方法
选中 view 里面的 AutoScroll Session List 即可
- react技术栈实践(2)
本文来自网易云社区 作者:汪洋 这时候还没完,又有两个问题引出来了. 按照上面的配置,第三方库 antd 竟然也被编译了,导致样式失败. react中,一旦包裹了子组件,子组件没办法直接使用 styl ...
- oracle整体结构-内存结构、物理结构、逻辑结构、进程
Oracle的体系结构大体上分为两部分:Instance(实例)和Database(数据库). Instance(实例) :在Oracle Instance中主要包含了SGA以及一些进程(例如:PMO ...