[SCOI2007]最大土地面积(旋转卡壳)
首先,最大四边形的四个点一定在凸包上
所以先求凸包
有个结论,若是随机数据,凸包包括的点大约是\(\log_2n\)个
然鹅,此题绝对不会这么轻松,若\(O(n^4)\)枚举,只有50分
所以还是要想正解
旋转卡壳是继承上一个点枚举,所以枚举对角线上的两点,通过旋转卡壳找剩余两点
复杂度\(O(n^2)\)
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<bitset>
#include<sstream>
#include<cstdlib>
#define QAQ int
#define TAT long long
#define OwO bool
#define ORZ double
#define F(i,j,n) for(QAQ i=j;i<=n;++i)
#define E(i,j,n) for(QAQ i=j;i>=n;--i)
#define MES(i,j) memset(i,j,sizeof(i))
#define MEC(i,j) memcpy(i,j,sizeof(j))
using namespace std;
const QAQ N=200005;
const ORZ eps=1e-8;
QAQ n;
struct Point{
ORZ x,y;
friend Point operator + (Point a,Point b){
Point t;
t.x=a.x+b.x;t.y=a.y+b.y;
return t;
}
friend Point operator - (Point a,Point b){
Point t;
t.x=a.x-b.x;t.y=a.y-b.y;
return t;
}
friend ORZ operator ^ (Point a,Point b){
return a.x*b.y-a.y*b.x;
}
friend ORZ operator * (Point a,Point b){
return a.x*b.x+a.y*b.y;
}
}a[N],s[N];
QAQ top;
ORZ ans;
QAQ sign(ORZ x){
return fabs(x)<=eps ? 0 : (x>0 ? 1 : -1);
}
ORZ dis(Point i,Point j){
return (i.x-j.x)*(i.x-j.x)+(i.y-j.y)*(i.y-j.y);
}
OwO comp(Point i,Point j){
ORZ x=(i-a[1])^(j-a[1]);
return x>0||x==0&&dis(a[1],i)<dis(a[1],j);
}
void Graham(){
QAQ k=1;
F(i,2,n) if(a[i].y<a[k].y||(a[i].y==a[k].y&&a[i].x<a[k].x)) k=i;
swap(a[k],a[1]);
sort(a+2,a+n+1,comp);
s[++top]=a[1];s[++top]=a[2];
F(i,3,n){
while(top>=2&&sign((s[top]-s[top-1]) ^ (a[i]-s[top-1]))<=0) top--; //"<=0" 别忘"="
s[++top]=a[i];
}
}
ORZ cal(Point i,Point j,Point k,Point l){
return (((k-i)^(j-i))+((l-i)^(k-i)))/2.0;
}
ORZ work(){
ORZ ans=0;
s[top+1]=a[1];
F(i,1,top){
QAQ a=i%top+1,b=(i+2)%top+1;
F(j,i+2,top){
while(a%top+1!=j&&(((s[a]-s[i])^(s[j]-s[i])))<(((s[a+1]-s[i])^(s[j]-s[i])))) (a%=top)+=1;
while(b%top+1!=j&&(((s[j]-s[i])^(s[b]-s[i])))<(((s[j]-s[i])^(s[b+1]-s[i])))) (b%=top)+=1;
//注意叉积的前后向量顺序
ans=max(ans,fabs(((s[a]-s[i])^(s[j]-s[i]))+((s[j]-s[i])^(s[b]-s[i]))));
}
}
return ans;
}
QAQ main(){
scanf("%d",&n);
F(i,1,n) scanf("%lf%lf",&a[i].x,&a[i].y);
Graham();
printf("%.3lf\n",work());
return 0;
}
[SCOI2007]最大土地面积(旋转卡壳)的更多相关文章
- bzoj1069 [SCOI2007]最大土地面积 旋转卡壳
1069: [SCOI2007]最大土地面积 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 3767 Solved: 1501[Submit][Sta ...
- BZOJ 1069: [SCOI2007]最大土地面积(旋转卡壳)
题目链接~ 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 ...
- luogu4166 最大土地面积 (旋转卡壳)
首先这样的点一定在凸包上 然后旋转卡壳就可以 具体来说,枚举对角线的一个端点,另一个端点在凸包上转,剩下两个点就是一个叉积最大一个最小,而这两个点也是跟着转的 所以是$O(N^2)$ #include ...
- 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: 3629 Solved: 1432[Submit][Sta ...
- luogu P4166 [SCOI2007]最大土地面积 凸包 旋转卡壳
LINK:最大土地面积 容易想到四边形的边在凸包上面 考虑暴力枚举凸包上的四个点计算面积. 不过可以想到可以直接枚举对角线的两个点找到再在两边各找一个点 这样复杂度为\(n^3\) 可以得到50分. ...
- 【BZOJ】1069: [SCOI2007]最大土地面积(凸包+旋转卡壳)
http://www.lydsy.com/JudgeOnline/problem.php?id=1069 显然这四个点在凸包上,然后枚举两个点找上下最大的三角形即可. 找三角形表示只想到三分QAQ.. ...
随机推荐
- vmware 仅主机模式 ip配置
首先关闭防火墙 主机(宿主机器 win7) 虚拟机(xp) 3..重要提示: 如果ping不通首先考虑防火墙的问题!!! vmware配置: nat模式下玩耍: 1. 配置nat的虚拟网卡: 2. ...
- request.getHeader("x-forwarded-for")这是什么意思
request.getHeader,简单的说就是获取请求的头部信息,根据http协议,它能获取到用户访问链接的信息,以下是我们常用的: request.getHeader("referer& ...
- 查看window下默认ORACLE_SID
Configuration and Migration Tools-----Configuration and Migration Tools-----Administration Assistant ...
- AJAX省市县三级联动的实现
省市县数据 本例子中省市县数据保存在MySQL数据库中,部分数据截图如下: 从数据库中读取数据 导入需要的jar包 连接池配置文件 <c3p0-config> <!-- 默认配置,如 ...
- Ant之build.xml详解---可用
Ant的概念 :在Eclipse中使用Ant Ant是Java平台下非常棒的批处理命令执行程序,能非常方便地自动完成编译,测试,打包,部署等等一系列任务,大大提高开发效率. Ant和make命令很像. ...
- Gym 101128 B Black Vienna
题意 有A-Z 26张牌,现在从中抽出3张牌,并把剩下的23张牌分给选手1和2,现在有n次询问,每次询问一个选手是否有某两张牌,和选手的回答.回答说自己有这两张牌中的几张,问拿出的三张牌有多少种方案能 ...
- 今天写shader流光效果,shader代码少了个括号,unity shader compiler卡死且不提示原因
今天写shader流光效果,shader代码少了个括号,unity shader compiler卡死且不提示原因 好在找到了原因,shader 代码如下,原理是提高经过的颜色亮度 void surf ...
- 使用Apache IO库操作IO与文件
--------------siwuxie095 首先到 Apache官网 下载相关的库文件 Apache官网:http://www.apach ...
- mybatis spring 框架整合
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/test user=LF password=LF <?xml versi ...
- 数字图像处理实验(17):PROJECT 06-04,Color Image Segmentation 标签: 图像处理MATLAB 2017-05-27 21:13
实验报告: Objective: Color image segmentation is a big issue in image processing. This students need to ...