【BZOJ1069】【SCOI2007】最大土地面积
题目大意:给定有n个点的点集,求该点集中任意四个点所构成的四边形中面积最大四边形的面积。
我们不难想到(不难yy出来),面积最大的四边形的四个顶点一定所给定的点集所构成的凸包上。我们求出给定点集的集合后,枚举一条对角线,由该对角线将凸包分为上下两部分,分别求出两个面积最大的三角形,面积加起来然后更新即可。对于每一次枚举,对角线的长度是固定的,由于凸包具有某些特殊性性质,我们可以通过三分求出面积最大的三角形的顶点,然后就OK了。
时间复杂度:$O(n^{2}*log(n))$。
刚开始因为我写得太挫,导致被卡了常数(1.1s),后来将原先两点距离公式+海伦公式求三角形面积法改为了铅锤法,从1100+ms降低至450ms才AC。
PS:此题其实可以用二分,三分有点多余(但是我不想改了啦啦啦)。
#include<bits/stdc++.h>
#define M 100000
#define y0 y123
#define pi acos(-1)
using namespace std;
double x0,y0=1e20;
struct node{
double x,y; node(){x=y=;}
node(double xx,double yy){x=xx; y=yy;}
friend bool operator <(node a,node b){
double ap1=atan((a.y)/(a.x));
double ap2=atan((b.y)/(b.x));
if(ap1<) ap1=pi+ap1;
if(ap2<) ap2=pi+ap2;
return ap1<ap2;
}
friend node operator -(node a,node b){return node(a.x-b.x,a.y-b.y);}
friend double operator *(node a,node b){return a.x*b.y-a.y*b.x;}
}a[M],s[M];
double dis(node a,node b){return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}
double gets(int i,int j,int k){
node A=s[i],B=s[j],C=s[k];
double d,K,b;
if(A.x>B.x) swap(A,B);
if(A.x>C.x) swap(A,C);
if(B.x>C.x) swap(B,C);
K=(A.y-C.y)/(A.x-C.x); b=A.y-A.x*K;
d=K*B.x+b;
return abs(d-B.y)*(C.x-A.x);
} int main(){
int n,use=; scanf("%d",&n);
for(int i=;i<=n;i++){
double x,y; cin>>x>>y;
a[i]=node(x,y);
if(y<a[].y) swap(a[],a[i]);
}
for(int i=;i<=n;i++) a[i]=a[i]-a[];
a[]=node(,);
sort(a+,a+n+); a[n+]=a[];
s[++use]=a[]; s[++use]=a[];
for(int i=;i<=n+;i++){
while(use>&&(a[i]-s[use-])*(s[use]-s[use-])>) use--;
if(i<=n) s[++use]=a[i];
}
n=use; double maxn=;
for(int i=;i<=n;i++) s[i+n]=s[i];
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++){
double sup=,sdn=,now=;
int l=i,r=j;
while(r-l>){
int mid1=(l+l+r)/,mid2=(l+r+r)/;
if(gets(i,j,mid1)>gets(i,j,mid2)) r=mid2;
else l=mid1;
}
for(int k=l;k<=r;k++) sup=max(sup,gets(i,j,k));
l=j; r=n+i-;
while(r-l>){
int mid1=(l+l+r)/,mid2=(l+r+r)/;
if(gets(i,j,mid1)>gets(i,j,mid2)) r=mid2;
else l=mid1;
}
for(int k=l;k<=r;k++) sdn=max(sdn,gets(i,j,k));
maxn=max(maxn,sup+sdn);
}
printf("%.3lf\n",maxn/.);
}
【BZOJ1069】【SCOI2007】最大土地面积的更多相关文章
- bzoj1069 SCOI2007 最大土地面积
1069: [SCOI2007]最大土地面积 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 2560 Solved: 983 Description ...
- bzoj1069 [SCOI2007]最大土地面积 旋转卡壳
1069: [SCOI2007]最大土地面积 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 3767 Solved: 1501[Submit][Sta ...
- [BZOJ1069][SCOI2007]最大土地面积 凸包+旋转卡壳
1069: [SCOI2007]最大土地面积 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 3669 Solved: 1451[Submit][Sta ...
- [Bzoj1069][Scoi2007]最大土地面积(凸包)(旋转卡壳)
1069: [SCOI2007]最大土地面积 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 3629 Solved: 1432[Submit][Sta ...
- BZOJ1069 SCOI2007最大土地面积(凸包+旋转卡壳)
求出凸包,显然四个点在凸包上.考虑枚举某点,再移动另一点作为对角线,容易发现剩下两点的最优位置是单调的.过程类似旋转卡壳. #include<iostream> #include<c ...
- BZOJ1069 [SCOI2007]最大土地面积 【凸包 + 旋转卡壳】
题目链接 BZOJ1069 题解 首先四个点一定在凸包上 我们枚举对角线,剩下两个点分别是两侧最远的点 可以三分,复杂度\(O(n^2logn)\) 可以借鉴旋转卡壳的思想,那两个点随着对角线的一定单 ...
- [BZOJ1069][SCOI2007]最大土地面积(水平扫描法求凸包+旋转卡壳)
题意:在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成. 的多边形面积最大.n<=2000. 先求凸包,再枚举对角线,随着对角线的斜率上升,另外两 ...
- BZOJ1069 SCOI2007 最大土地面积 凸包、旋转卡壳
传送门 在这里假设可以选择两个相同的点吧-- 那么选出来的四个点一定会在凸包上 建立凸包,然后枚举这个四边形的对角线.策略是先枚举对角线上的一个点,然后沿着凸包枚举另一个点.在枚举另一个点的过程中可以 ...
- bzoj1069: [SCOI2007]最大土地面积 凸包+旋转卡壳求最大四边形面积
在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成的多边形面积最大. 题解:先求出凸包,O(n)枚举旋转卡壳,O(n)枚举另一个点,求最大四边形面积 /* ...
- 【BZOJ-1069】最大土地面积 计算几何 + 凸包 + 旋转卡壳
1069: [SCOI2007]最大土地面积 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 2707 Solved: 1053[Submit][Sta ...
随机推荐
- jQuery使用大全
我的程序人生 提供基于Lesktop的IM二次开发,联系QQ:76159179 CnBlogs Home New Post Contact Admin Rss Posts - 476 Article ...
- python之数据类型3和文件操作
一 字典属性方法补充 key是不变的类型,字典能快速查找,基于哈希索引 不可变类型 int bool str tuple 可变类型:list dict set 1 clear :清空 # ...
- 2018.10.13 bzo1934: [Shoi2007]Vote 善意的投票(最小割)
传送门 最小割定义题. 按照题意建边就行了. 考虑把冲突变成把aaa选入不与自己匹配的集合所需要付出的代价. 然后跑最小割就行了. 代码: #include<bits/stdc++.h> ...
- 2018.09.15 hdu3018Ant Trip(欧拉路)
传送门 显然答案等于各个连通分量的笔画数之和. 因此我们dfs每个连通分量计算对答案的贡献. 对于一个连通分量,如果本来就有欧拉回路那么只需要一笔. 否则需要寄点数/2那么多笔才能画完. 知道这个结论 ...
- 2018.07.08 hdu4521 小明系列问题——小明序列(线段树+简单dp)
小明系列问题--小明序列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Proble ...
- 改变yii2 $form最外层div样式
<?php $form = ActiveForm::begin([ 'options'=>['class' => 'form-horizontal row-border','enct ...
- hdu-1711(kmp算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 思路:kmp模板,注意用scanf,不然超时. #include<iostream> ...
- HDU 2546 饭卡 (01背包问题)
题意:中文的吧,飘过~ 析:学过DP的都应该感觉到是动态规划吧,就是一个01背包问题,不同的是,这个题又加入一些新的条件,就是不满5元不能消费,过了5元即使超了也行(这个学校真不错,都可以预支),最后 ...
- Hdu1342 Lotto 2017-01-18 17:12 44人阅读 评论(0) 收藏
Lotto Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submiss ...
- ALIZE初涉
ALIZE初涉 在做GMM-UBM和i-vector时都用到了ALIZE,不得不说十分良心,在linux下很方便,但同时也有一些问题,流程总结如下 安装 在http://alize.univ-avig ...