题目大意:给定有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】最大土地面积的更多相关文章

  1. bzoj1069 SCOI2007 最大土地面积

    1069: [SCOI2007]最大土地面积 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 2560  Solved: 983 Description ...

  2. bzoj1069 [SCOI2007]最大土地面积 旋转卡壳

    1069: [SCOI2007]最大土地面积 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 3767  Solved: 1501[Submit][Sta ...

  3. [BZOJ1069][SCOI2007]最大土地面积 凸包+旋转卡壳

    1069: [SCOI2007]最大土地面积 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 3669  Solved: 1451[Submit][Sta ...

  4. [Bzoj1069][Scoi2007]最大土地面积(凸包)(旋转卡壳)

    1069: [SCOI2007]最大土地面积 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 3629  Solved: 1432[Submit][Sta ...

  5. BZOJ1069 SCOI2007最大土地面积(凸包+旋转卡壳)

    求出凸包,显然四个点在凸包上.考虑枚举某点,再移动另一点作为对角线,容易发现剩下两点的最优位置是单调的.过程类似旋转卡壳. #include<iostream> #include<c ...

  6. BZOJ1069 [SCOI2007]最大土地面积 【凸包 + 旋转卡壳】

    题目链接 BZOJ1069 题解 首先四个点一定在凸包上 我们枚举对角线,剩下两个点分别是两侧最远的点 可以三分,复杂度\(O(n^2logn)\) 可以借鉴旋转卡壳的思想,那两个点随着对角线的一定单 ...

  7. [BZOJ1069][SCOI2007]最大土地面积(水平扫描法求凸包+旋转卡壳)

    题意:在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成. 的多边形面积最大.n<=2000. 先求凸包,再枚举对角线,随着对角线的斜率上升,另外两 ...

  8. BZOJ1069 SCOI2007 最大土地面积 凸包、旋转卡壳

    传送门 在这里假设可以选择两个相同的点吧-- 那么选出来的四个点一定会在凸包上 建立凸包,然后枚举这个四边形的对角线.策略是先枚举对角线上的一个点,然后沿着凸包枚举另一个点.在枚举另一个点的过程中可以 ...

  9. bzoj1069: [SCOI2007]最大土地面积 凸包+旋转卡壳求最大四边形面积

    在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成的多边形面积最大. 题解:先求出凸包,O(n)枚举旋转卡壳,O(n)枚举另一个点,求最大四边形面积 /* ...

  10. 【BZOJ-1069】最大土地面积 计算几何 + 凸包 + 旋转卡壳

    1069: [SCOI2007]最大土地面积 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 2707  Solved: 1053[Submit][Sta ...

随机推荐

  1. jsp调用java servlet

    1.依赖jar servlet-api.jar 2.工程结构 3.java servlet实现类 package testServlet; import java.io.IOException; im ...

  2. 日历时间选择控件---3(支持ie、火狐)

    效果展示:  源代码: <script language=javascript ><!--/* 调用方法:不能用onfocus,要用onclick  <input onclic ...

  3. Error setting expression 'XXX‘'[Ljava.lang.with value '[Ljava.lang.String;@10101fb'

    ognl报的警告,说明你的格式错误,一般是日期格式错误,格式转换器的应用,id设置的类型不对String 类型,输入了Int类型所以方法一是改变这个类中的id的属性 然后get和set也跟着改变 另一 ...

  4. Before an Exam

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=93241#problem/B (654123) http://codeforces.com ...

  5. HDU6026 Deleting Edges 2017-05-07 19:30 38人阅读 评论(0) 收藏

    Deleting Edges                                                                                  Time ...

  6. HDU6029 Happy Necklace 2017-05-07 19:11 45人阅读 评论(0) 收藏

    Happy Necklace                                                                           Time Limit: ...

  7. 使用Xcode 7 beta免费真机调试iOS应用程序

    使用Xcode 7 beta免费真机调试iOS应用程序 六月 9, 2015  |   K-Res 发布   今天凌晨的WWDC15虽然没有熬夜守候吧,但也还是早起第一时间翻看了twitter的相关标 ...

  8. 设计模式之代理模式(Proxy Pattern)_补充篇

    写在前面: 代理模式的内部原理,作用及远程代理的实现在上一篇博文中都做了详细解释,本文只是对其内容的补充,介绍其它代理 一.虚拟代理 首先,明确虚拟代理的作用:在巨大对象被真正创建出来之前,用虚拟代理 ...

  9. WebAPI+Html跨域时对session的支持

    1.Global.asax中添加对Session的支持,重新Init方法: public override void Init() { this.PostAuthenticateRequest += ...

  10. DI spring.net简单使用

    IOC或DI  spring.net简单使用 一.spring.net是什么? Spring 框架本是 Java 平台上一个应用非常多的.开源的框架.虽然语言是固定的,但是好的方法应该是通用的,于是 ...