Description

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

Input

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

Output

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

Sample Input

5
0 0
1 0
1 1
0 1
0.5 0.5

Sample Output

1.000

HINT

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

Solution

显然四个点都在凸包上啊!

显然的,我们枚举对角线,我们现在的问题是找离对角线最远的点是哪两个点

于是我们发现,当A固定,C变为逆时针的下一个点的时候,

B,D也一定是单调逆时针变动的

这里运用旋转卡壳的思想

所以这题本质是旋转卡壳,只是更加简单了

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<queue>
#include<map>
#include<vector>
#include<set>
#define il inline
#define re register
using namespace std;
typedef double db;
const int N=;
const db eps=1e-;
struct P{db x,y;} a[N],s[N];
int n,top;db ans=;
il P operator-(P a,P b){
return (P){a.x-b.x,a.y-b.y};
}
il db operator*(P a,P b){
return a.x*b.y-a.y*b.x;
}
il db S(P a,P b,P c){
return fabs((a-b)*(a-c))/;
}
il db dis(P a){
return a.x*a.x+a.y*a.y;
}
il db cmp(P x,P y){
return (x-a[])*(y-a[])>;
}
il void print(P a){
printf("(%lf,%lf)\n",a.x,a.y);
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%lf%lf",&a[i].x,&a[i].y);
}
for(int i=;i<=n;i++)
if(a[i].y<a[].y||(a[i].y==a[].y&&a[i].x<a[].x)) swap(a[],a[i]);
sort(a+,a+n+,cmp);
s[]=a[];s[]=a[];top=;
for(int i=;i<=n;i++){
while(top>&&(a[i]-s[top-])*(s[top]-s[top-])>=) top--;
s[++top]=a[i];
}
if(top==){
ans=S(s[],s[],s[])+S(s[],s[],s[]);
printf("%.3lf",ans);
return ;
}
// for(int i=1;i<=top;i++) print(s[i]);
for(int i=;i<top;i++) s[i]=s[i+];
n=top;
for(int i=;i<n;i++){
for(int j=(i+)%n,k=(i+)%n,l=(i+)%n;k!=(i-+n)%n;k=(k+)%n){
while(S(s[i],s[j],s[k])<S(s[i],s[(j+)%n],s[k])) j=(j+)%n;
while(S(s[i],s[l],s[k])<S(s[i],s[(l+)%n],s[k])) l=(l+)%n;
// cout<<i<<" "<<j<<" "<<k<<" "<<l<<endl;
ans=max(S(s[i],s[j],s[k])+S(s[i],s[k],s[l]),ans);
}
}
printf("%.3lf",ans);
return ;
}

【bzoj1069】最大土地面积的更多相关文章

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

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

  2. bzoj1069 SCOI2007 最大土地面积

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. PuTTY+Xming实现X11的ssh转发

    1 需求分析 有些Linux程序还是不能完全离开窗口环境,或者说离开后操作不方便.其中Oracle就是这样一个程序,其工具程序大多数能够在纯命令行静默执行,如 OCI,DBCA,NetCA等,但是工作 ...

  2. vb6/ASP FORMAT MM/DD/YYYY

    VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办法, Format 或者FormatDateTime 竟然结果和系统设置的区域语言的日期和时间格式相关.意思是尽管你用诸如 F ...

  3. go语言之行--结构体(struct)详解、链表

    一.struct简介 go语言中没有像类的概念,但是可以通过结构体struct实现oop(面向对象编程).struct的成员(也叫属性或字段)可以是任何类型,如普通类型.复合类型.函数.map.int ...

  4. WPF编程,C#中弹出式对话框 MessageBox 的几种用法。

    原文:WPF编程,C#中弹出式对话框 MessageBox 的几种用法. 1.MessageBox.Show("Hello~~~~"); 最简单的,只显示提示信息.   2.Mes ...

  5. 洛咕 P3702 [SDOI2017]序列计数

    和https://www.cnblogs.com/xzz_233/p/10060753.html一样,都是多项式快速幂,还比那个题水. 设\(a[i]\)表示\([1,m]\)中$ \mod p\(余 ...

  6. [CF981F]Round Marriage[二分+霍尔定理]

    题意 洛谷 分析 参考了Icefox 首先二分,然后考虑霍尔定理判断是否有完美匹配.如果是序列的话,因为这里不会出现 \(j<i,L(i)<L(j)\) 或者 \(j<i,R(i)& ...

  7. VS Code使用Git管理代码

    Visual Studio Code(简称VS Code)是一个轻量级且强大的代码编辑器,后台是微软,支持Windows.Mac和Linux操作系统,拥有丰富的插件生态系统,可通过安装插件来支持C++ ...

  8. C语言与数据库操作入门

    https://blog.csdn.net/flyingqd/article/details/78763652 C语言与数据库操作入门(Win版) 2017年12月10日 17:30:17 阅读数:1 ...

  9. vector读入指定行数但不指定列数的数字

    #include <iostream> #include <vector> #include <cstdio> #include <cstring> # ...

  10. DRF框架获取参数的方式

    DRF获取参数的方式 例如url url(r'^demo/(?P<word>.*)/$', DemoView.as_view()) 在类视图中获取参数 url:http://127.0.0 ...