题目大意:给定有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. jQuery load和unload函数使用

    实例 当用户点击链接离开本页时,弹出一个消息框: $(window).unload(function(){ alert("Goodbye!"); }); 亲自试一试 定义和用法 当 ...

  2. 30. Child Labor Problem and Its Solution 童工问题及解决方法

    30. Child Labor Problem and Its Solution 童工问题及解决方法 ① Over a hundred years ago,Charles Dickens shocke ...

  3. phonegap android插件,启动activity并返回值

    Your execute menthod is not quite right. When you do: return new PluginResult(PluginResult.Status.OK ...

  4. MATLAB中的快捷键

    Ctrl + c  中止程序的运行,鼠标要点到命令窗内.

  5. ISO 8895-1

    https://en.wikipedia.org/wiki/ISO/IEC_8859-1#Codepage_layout http://czyborra.com/charsets/

  6. QGIS Server Quickstart

    http://live.osgeo.org/en/quickstart/qgis_mapserver_quickstart.html

  7. Android类装载器DexClassLoader的简单使用-----制作android插件的前奏

    声明:此篇文章借鉴<android内核剖析>整理得来. 一.装载器简介 “类装载器”(ClassLoader),顾名思义,就是用来动态装载class文件的.标准的Java SDK中有个Cl ...

  8. codevs 1083

    这道题是看了人家大牛的解题报告: 对了,要说明一下,(A+B)&1 ,表示,判断(A+B)是奇数否? 下面给出代码: #include<iostream> #include< ...

  9. Fading Like a Flower

    Fading Like a Flower In a time where the sun descends alone 伴着落日孤独的脚步 I ran a long long way from hom ...

  10. C#内存释放(垃圾回收)

    今天写了个很小的程序,程序的功能仅仅是截图,但是如果长时间开启并截图的时候,程序会变的很大,从刚开始的运行在任务管理器中只有十几K大小,运行一段时间后在任务管理器中看到程序可以达到1G或2G甚至更大: ...