BZOJ 1069: [SCOI2007]最大土地面积(旋转卡壳)
题目链接~
1069: [SCOI2007]最大土地面积
思路很简单,极角排序求完凸包后,在凸包上枚举对角线,然后两边分别来两个点旋转卡壳一下,搞定!
不过计算几何的题目就是这样,程序中间的处理还是比较麻烦的,写的时候要很小心,特别是存点和枚举的时候要注意是个循环。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm> #define For(i,a,b) for(register int i=a;i<=b;++i)
#define Dwn(i,a,b) for(register int i=a;i>=b;--i)
#define Re register using namespace std; const int N=; struct P{
double x,y;
}st[N],O,p[N];
int n,top=-; P operator -(P a,P b){
P t; t.x=a.x-b.x; t.y=a.y-b.y; return t;
}
double operator *(P a,P b){
return a.x*b.y-b.x*a.y;
}
double Dis(P a,P b){
return sqrt( (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y) );
}
int Xx(P a){
if(a.x-O.x> &&a.y-O.y>=)return ;
if(a.x-O.x<=&&a.y-O.y> )return ;
if(a.x-O.x< &&a.y-O.y<=)return ;
if(a.x-O.x>=&&a.y-O.y< )return ;
}
bool cmp(const P a,const P b){
int aX=Xx(a);
int bX=Xx(b);
if(aX!=bX)return aX<bX;
double cx= (a-O)*(b-O);
if(cx==)return a.x<b.x;
else return cx>;
}
bool cmpY(const P a,const P b){
return a.y<b.y;
} void TuBao(){
st[++top]=p[];
st[++top]=p[];
For(i,,n+){
while( (p[i]-st[top-])*(st[top]-st[top-])>= ) top--;
st[++top]=p[i];
}
} double ans=;
void SpinStir(){
P p1,p2;
int i1,i2;
For(x,,top-){
i1=(x+)%top; p1=st[i1];
i2=(x+)%top; p2=st[i2];
For(y,x+,top-){
int Ni; P Np; Ni=(i1+)%top;
Np=st[Ni];
while(Ni!=x&&(Np-st[y])*(st[x]-st[y])>(p1-st[y])*(st[x]-st[y])){
i1=Ni; p1=Np; Ni=(i1+)%top; Np=st[Ni];
} Ni=(i2+)%top;
Np=st[Ni];
while(Ni!=y&&(Np-st[x])*(st[y]-st[x])>(p2-st[x])*(st[y]-st[x])){
i2=Ni; p2=Np; Ni=(i2+)%top; Np=st[Ni];
} double Sm=(p1-st[y])*(st[x]-st[y])/ + (p2-st[x])*(st[y]-st[x])/;
ans=max(ans,Sm);
}
}
} int main(){
//freopen("ex.in","r",stdin); scanf("%d",&n);
For(i,,n){
scanf("%lf%lf",&p[i].x,&p[i].y);
}
sort(p+,p+n+,cmpY);
O=p[];
sort(p+,p+n+,cmp);
p[n+]=p[];
TuBao();
SpinStir();
printf("%.03lf",ans);
return ; }
BZOJ 1069: [SCOI2007]最大土地面积(旋转卡壳)的更多相关文章
- BZOJ 1069: [SCOI2007]最大土地面积 [旋转卡壳]
1069: [SCOI2007]最大土地面积 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 2978 Solved: 1173[Submit][Sta ...
- bzoj 1069 [SCOI2007]最大土地面积——旋转卡壳
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1069 发现 n 可以 n^2 .所以枚举对角线,分开的两部分三角形就可以旋转卡壳了. 注意坐 ...
- 1069: [SCOI2007]最大土地面积|旋转卡壳
旋转卡壳就是先求出凸包.然后在凸包上枚举四边形的对角线两側分别找面积最大的三角形 因为在两側找面积最大的三角形的顶点是单调的所以复杂度就是n2 单调的这个性质能够自行绘图感受一下,似乎比較显然 #in ...
- bzoj 1069 [SCOI2007]最大土地面积(旋转卡壳)
1069: [SCOI2007]最大土地面积 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2277 Solved: 853[Submit][Stat ...
- bzoj1069 [SCOI2007]最大土地面积 旋转卡壳
1069: [SCOI2007]最大土地面积 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 3767 Solved: 1501[Submit][Sta ...
- bzoj 1069: [SCOI2007]最大土地面积 凸包+旋转卡壳
题目大意: 二维平面有N个点,选择其中的任意四个点使这四个点围成的多边形面积最大 题解: 很容易发现这四个点一定在凸包上 所以我们枚举一条边再旋转卡壳确定另外的两个点即可 旋(xuan2)转(zhua ...
- ●BZOJ 1069 [SCOI2007]最大土地面积
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1069 题解: 计算几何,凸包,旋转卡壳 其实和这个题差不多,POJ 2079 Triangl ...
- [BZOJ]1069: [SCOI2007]最大土地面积
题目大意:给出二维平面上n个点,求最大的由这些点组成的四边形面积.(n<=2000) 思路:求出凸包后旋转卡壳枚举对踵点对作为四边形的对角线,枚举或二分另外两个点,复杂度O(n^2)或O(nlo ...
- BZOJ 1069 [SCOI2007]最大土地面积 ——计算几何
枚举对角线,然后旋转卡壳即可. #include <map> #include <cmath> #include <queue> #include <cstd ...
随机推荐
- nginx负载均衡设置
在nginx的配置文件[./conf/nginx.conf]中加入: upstream test.balance123.com { server 192.168.1.223:80; server 19 ...
- Contiki 2.7 Makefile 文件(三)
2.第二部分 这里的usage,targets,savetarget,savedefines都是伪目标. 和all不同,这些伪目标不会被执行,除非显式指定这些目标. 这里有两个目标savetarget ...
- Hive- Hive安装
Hive安装 1.1下载Hive安装包 官网:http://hive.apache.org/downloads.html 个人建议到这里下载:http://apache.forsale.plus/ 1 ...
- python关于文件路径和文件名的操作
os.path.abspath(path) #返回绝对路径(包含文件名的全路径) os.path.basename(path) —— 去掉目录路径获取文件名 os.path.dirname(path) ...
- 分享知识-快乐自己:Oracle基本语法(创建:表空间、用户、授权、约束等)使用指南
Oracle12c 与 Oracle11g 创建用户时有差别.Oracle12C默认为 CDB模式 这时创建用户的时候需要加上 c## 开头:例如:c##MLQ. --说明--需求:创建表空间(MLQ ...
- Jexus是一款Linux平台上的高性能WEB服务器和负载均衡网关
什么是Jexus Jexus是一款Linux平台上的高性能WEB服务器和负载均衡网关,以支持ASP.NET.ASP.NET CORE.PHP为特色,同时具备反向代理.入侵检测等重要功能.可以这样说,J ...
- 解决按 backspace键 出现 ^H 问题
输入命令 stty erase ^H #stty 时一个用来改变并打印终端行设置的常用命令stty iuclc # 在命令行下禁止输出大写stty -iuclc ...
- ZigBee自组网地址分配与路由协议概述
1. ZigBee简介 ZigBee是基于IEEE802.15.4标准的低功耗局域网协议.根据国际标准规定,ZigBee技术是一种短距离.低功耗的无线通信技术. ZigBee协议从下到上分别为物理层( ...
- ClientSocket.h ClientSocket.cpp
ClientSocket.h #pragma once // CClientSocket 命令目标 #include "ClientProDlg.h" #include " ...
- ipv4 ipv6简介
互联网协议地址(英语:Internet Protocol Address,又译为网际协议地址),缩写为IP地址(IP Address),在Internet上,一种给主机编址的方式.常见的IP地址,分为 ...