1069: [SCOI2007]最大土地面积


Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 3629  Solved: 1432
[Submit][Status][Discuss]

Description


  在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成
的多边形面积最大。

Input


  第1行一个正整数N,接下来N行,每行2个数x,y,表示该点的横坐标和纵坐标。

Output


  最大的多边形面积,答案精确到小数点后3位。

Sample Input



0.5 0.5

Sample Output


1.000

HINT


数据范围 n<=2000, |x|,|y|<=100000

 

分析:


其实自己想想就可以明白,最大的四边形的四个点一定都在凸包上。
那么用graham先求出凸包。
然后就是如何求最大的四边形了。
我们枚举对角线,O(n²)的枚举,然后在对角线两侧找最大的三角形,合起来就是最大的四边形,因为是凸包,三角形的面积变化是类似于二次函数的,并且在旋转对角线的同时,最大三角形面积的那个点也在往相同方向旋转,旋转卡壳就可以了。
总复杂度O(n² )
 

贴上AC代码:


  

# include <iostream>
# include <cstdio>
# include <cstring>
# include <cmath>
# include <algorithm>
using namespace std;
struct data{
double x,y;
}node[],s[];
int n,top;
double ans;
double dis(data a,data b){
return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}
double mul(data a,data b,data c){
return (a.x - c.x) * (b.y - c.y) - (b.x - c.x) * (a.y - c.y);
}
bool cmp(data a,data b)
{
if(mul(a,b,node[]) == )return dis(a,node[]) < dis(b,node[]);
return mul(a,b,node[]) > ;
}
void Graham(){
int k = ;
for(int i = ;i <= n;i++)
if((node[k].y > node[i].y) || (node[k].y == node[i].y && node[k].x > node[i].x))k = i;
swap(node[k],node[]);
sort(node + ,node + n + ,cmp);
s[++top] = node[],s[++top] = node[];
for(int i = ;i <= n;i++){
while(top && mul(node[i],s[top],s[top - ]) >= )top--;
s[++top] = node[i];
}
}
void rc(){
s[top + ] = node[];
int a,b;
for(int x = ;x <= top;x++){
a = x % top + ;b = (x + ) % top + ;
for(int y = x + ;y <= top;y++){
while(a % top + != y && -mul(s[y],s[a + ],s[x]) > -mul(s[y],s[a],s[x]))a = a % top + ;
while(b % top + != x && -mul(s[b + ],s[y],s[x]) > -mul(s[b],s[y],s[x]))b = b % top + ;
ans = max(-mul(s[y],s[a],s[x]) + -mul(s[b],s[y],s[x]),ans);
}
}
}
int main(){
scanf("%d",&n);
for(int i = ;i <= n;i++)scanf("%lf %lf",&node[i].x,&node[i].y);
Graham();rc();
printf("%.3f",ans / );
return ;
}

[Bzoj1069][Scoi2007]最大土地面积(凸包)(旋转卡壳)的更多相关文章

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

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

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

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

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

    LINK:最大土地面积 容易想到四边形的边在凸包上面 考虑暴力枚举凸包上的四个点计算面积. 不过可以想到可以直接枚举对角线的两个点找到再在两边各找一个点 这样复杂度为\(n^3\) 可以得到50分. ...

  4. bzoj 1069: [SCOI2007]最大土地面积 凸包+旋转卡壳

    题目大意: 二维平面有N个点,选择其中的任意四个点使这四个点围成的多边形面积最大 题解: 很容易发现这四个点一定在凸包上 所以我们枚举一条边再旋转卡壳确定另外的两个点即可 旋(xuan2)转(zhua ...

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

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

  6. bzoj 1069 [SCOI2007]最大土地面积(旋转卡壳)

    1069: [SCOI2007]最大土地面积 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2277  Solved: 853[Submit][Stat ...

  7. 【BZOJ 1069】【SCOI 2007】最大土地面积 凸包+旋转卡壳

    因为凸壳上对踵点的单调性所以旋转卡壳线性绕一圈就可以啦啦啦--- 先求凸包,然后旋转卡壳记录$sum1$和$sum2$,最后统计答案就可以了 #include<cmath> #includ ...

  8. [SCOI2007]最大土地面积(旋转卡壳)

    首先,最大四边形的四个点一定在凸包上 所以先求凸包 有个结论,若是随机数据,凸包包括的点大约是\(\log_2n\)个 然鹅,此题绝对不会这么轻松,若\(O(n^4)\)枚举,只有50分 所以还是要想 ...

  9. [USACO2003][poj2187]Beauty Contest(凸包+旋转卡壳)

    http://poj.org/problem?id=2187 题意:老题了,求平面内最远点对(让本渣默默想到了悲剧的AHOI2012……) 分析: nlogn的凸包+旋转卡壳 附:http://www ...

  10. UVA 4728 Squares(凸包+旋转卡壳)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=17267 [思路] 凸包+旋转卡壳 求出凸包,用旋转卡壳算出凸包的直 ...

随机推荐

  1. UVA 11346 Probability 概率 (连续概率)

    题意:给出a和b,表示在直角坐标系上的x=[-a,a] 和 y=[-b,b]的这样一块矩形区域.给出一个数s,问在矩形内随机选择一个点p=(x,y),则(0.0)和p点组成的矩形面积大于s的概率是多少 ...

  2. QT+常见控件+tab Widget 和Stacked Widget

    首先:这里介绍以下tab Widget 和Stacked Widget 之间的区别和使用的方法: tab Widget控件可以直接的进行切换,Stacked Widget却不可以直接在界面上进行切换, ...

  3. Ubuntu18.04 NVIDIA显卡驱动 安装大全

    离线安装NVIDIA显卡驱动 费了一天的劲,走了好多的坑,最主要的原因是gcc版本的问题,一定要用最新版本的gcc!!! 1)官网下载显卡驱动 2)apt 下载gcc包及其依赖包,可用apt-cach ...

  4. docker-ce的安装

    Docker提供了两个版本:社区版(CE)和企业版(EE). Docker社区版(CE)是开发人员和小型团队开始使用Docker并尝试使用基于容器的应用的理想之选.Docker CE有两个更新渠道,即 ...

  5. CentOS 7的docker安装初始化

    1: 安装必要的一些系统工具 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 2: 添加软件源信息 添加阿里源这样下载 ...

  6. centos6.7升级python3.6.1

    --安装依赖包 yum -y install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel ...

  7. vue项目中设置跨域

    config->index.js 'use strict' // Template version: 1.3.1 // see http://vuejs-templates.github.io/ ...

  8. GIL和copy

    GIL: Global Interpreter Lock 全局解释器锁 多任务执行占CPU 多任务占用CPU的资源消耗:进程>线程>协程 在cpython解释器中只有进程是真的多任务,线程 ...

  9. C++实现顺序栈类求解中缀表达式的计算

    控制台第一行打印的数值为使用形如以下方式得到的结果: cout << +*(+)*/- << endl; 即第一个待求解表达式由C++表达式计算所得结果,以用于与实现得出的结果 ...

  10. luogu3168 [CQOI2015]任务查询系统

    树状数组不用动脑子真爽啊 #include <algorithm> #include <iostream> #include <cstdio> using name ...