【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 ...
随机推荐
- Remove duplicates
https://github.com/Premiumlab/Python-for-Algorithms--Data-Structures--and-Interviews/blob/master/Moc ...
- 2018.10.01 NOIP模拟 偷书(状压dp)
传送门 状压dp经典题. 令f[i][j]f[i][j]f[i][j]表示到第i个,第i−k+1i-k+1i−k+1~iii个物品的状态是j时的最大总和. 然后简单维护一下转移就行了. 由于想皮一下果 ...
- 2018.07.29~30 uoj#170. Picks loves segment tree VIII(线段树)
传送门 线段树好题. 维护区间取两种最值,区间加,求区间两种历史最值,区间最小值. 自己的写法调了一个晚上+一个上午+一个下午+一个晚上并没有调出来,90" role="prese ...
- 44 The shopping psychology 购物心理
The shopping psychology 购物心理 ①People can be addicted to different things ---e. g.,alcohol, drugs, ce ...
- 21 Survival of Desert Life 沙漠生命的延续
Survival of Desert Life 沙漠生命的延续 ① Some desert animals can survive the very strong summer heat and dr ...
- 201709015工作日记--IntentService使用
一.IntentService与Service的区别 Service 是 Android 四大组件之一,正常来说,我们直接使用 Service 就可以了. 但是 Service 存在几个问题: 默认不 ...
- Get size of all tables in database
http://stackoverflow.com/questions/7892334/get-size-of-all-tables-in-database SELECT t.NAME AS Table ...
- sklearn 中fit_tansform 与 transform的区别
https://blog.csdn.net/anecdotegyb/article/details/74857055 先fit_transform 后transform,不然会报错.
- maven仓库地址配置
# 背景 maven中央存库在国外,访问缓慢,一般国内镜像,这里推荐阿里云的 http://maven.aliyun.com/nexus/content/groups/public 我之前采用的方式是 ...
- C# TinyMapper
https://github.com/TinyMapper/TinyMapper 据说性能蛮高的,我没对比测试过. NuGet安装下. 新增三个实体. public class A { public ...