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

题解:先求出凸包,O(n)枚举旋转卡壳,O(n)枚举另一个点,求最大四边形面积

/**************************************************************Problem: 1069User: walfyLanguage: C++Result: AcceptedTime:892 msMemory:1360 kb
****************************************************************///#pragma comment(linker, "/stack:200000000")
//#pragma GCC optimize("Ofast,no-stack-protector")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
//#pragma GCC optimize("unroll-loops")
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pi acos(-1.0)
#define ll long long
#define vi vector<int>
#define mod 10007
#define C 0.5772156649
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#define pil pair<int,ll>
#define pli pair<ll,int>
#define pii pair<int,int>
#define cd complex<double>
#define ull unsigned long long
#define base 1000000000000000000
#define fio ios::sync_with_stdio(false);cin.tie(0)using namespace std;const double eps=1e-6;
const int N=2000+10,maxn=5000+10,inf=0x3f3f3f3f,INF=0x3f3f3f3f3f3f3f3f;struct point{ll x,y;
};
point p[N],s[N];
int top,n;
ll dir(point p1,point p2,point p3)
{return (p3.x-p2.x)*(p2.y-p1.y)-(p3.y-p2.y)*(p2.x-p1.x);
}
ll dis(point a,point b)
{return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
ll area(point p1,point p2,point p3)
{return fabs(dir(p1,p2,p3));
}
bool cmp(point a,point b)
{ll te=dir(p[0],a,b);if(te<0)return 1;if(te==0&&dis(p[0],a)<dis(p[0],b))return 1;return 0;
}
void graham()
{int pos,minx,miny;minx=miny=inf;for(int i=0;i<n;i++){if(p[i].x<minx||(p[i].x==minx&&p[i].y<miny)){minx=p[i].x;miny=p[i].y;pos=i;}}swap(p[0],p[pos]);sort(p+1,p+n,cmp);p[n]=p[0];s[0]=p[0],s[1]=p[1],s[2]=p[2];top=2;for(int i=3;i<=n;i++){while(dir(s[top-1],s[top],p[i])>=0&&top>=2)top--;s[++top]=p[i];}ll ans=0;for(int i=0;i<top;i++){int j,a1=(i+1)%top,a2=(i+3)%top;for(j=(i+2)%top;j!=i;j=(j+1)%top){while(a1!=j&&area(s[(a1+1)%top],s[i],s[j])>=area(s[a1],s[i],s[j]))a1=(a1+1)%top;while(a2!=i&&area(s[(a2+1)%top],s[i],s[j])>=area(s[a2],s[i],s[j]))a2=(a2+1)%top;ans=max(ans,area(s[a1],s[i],s[j])+area(s[a2],s[i],s[j]));}}printf("%.3f\n",1.0*ans/2);
}
int main()
{scanf("%d",&n);for(int i=0;i<n;i++)scanf("%lld%lld",&p[i].x,&p[i].y);graham();return 0;
}
/****************************************/

View Code

转载于:https://www.cnblogs.com/acjiumeng/p/9073981.html

bzoj1069: [SCOI2007]最大土地面积 凸包+旋转卡壳求最大四边形面积相关推荐

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

    1069: [SCOI2007]最大土地面积 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 3438  Solved: 1373 [Submit][S ...

  2. Gym - 102460L Largest Quadrilateral(几何-凸包+旋转卡壳求最大的四边形面积)

    题目链接:点击查看 题目大意:在笛卡尔坐标系上给出 n 个点,要求选出四个点,使得组成的四边形面积最大,求出这个最大的面积,注意此处组成的四边形不是严格意义上的四边形,只需要选四个点就行 题目分析:首 ...

  3. bzoj1069 [SCOI2007]最大土地面积 凸包+单调性

    先做凸包 枚举对角线,然后两个指针单调的扫.. 枚举的顺序有时候也会创造性质 注意重点不能选! 码: #include<iostream> #include<cstdio> # ...

  4. POJ - 2187 Beauty Contest (求距离最远点对-凸包+旋转卡壳/枚举 (旋转卡壳学习))

    链接:https://vjudge.net/problem/POJ-2187 题意:求求距离最远点对. 思路:肯定为凸包上的点,可枚举,也可根据凸包性质旋转卡壳求对踵点. 参考博客: https:// ...

  5. POJ 2187 凸包+旋转卡壳

    思路: 求个凸包 旋转卡壳一下 就求出来最远点对了 注意共线情况 也就是说   凸包如果有一堆点共线保留端点即可 //By SiriusRen #include <cmath> #incl ...

  6. hdu2202 凸包+旋转卡壳

    点击打开hdu2202 思路:最大三角形面积,那么肯定这三个点在最外围,所以先求凸包,然后用旋转卡壳求出那三个点求出面积最大. #include <iostream> #include & ...

  7. 凸包旋转卡壳(andrew)

    题目链接 如图计算上凸包时判断C1,C2,C3C_1,C_2,C_3C1​,C2​,C3​显然C3C_3C3​是经过A,BA,BA,B的上凸包 可以发现只需要通过A,BA,BA,B即可判断,通过观察可 ...

  8. 任意给4条边求形成四边形面积最大值

    题目:任意给4条边,求形成四边形面积最大值. 结论:形成的四边形的四个顶点都在它的外接圆上,面积S满足: 其中 这也即是圆内接四边形的面积公式. 证明过程: 首先我们把四边形的四个顶点和四条边顺次分别 ...

  9. 【BZOJ1069】【SCOI2007】—最大土地面积(凸包+旋转卡壳)

    传送门 考虑枚举任意222个点,那么只需要枚举第二个点的时候旋转卡壳就可以O(n)O(n)O(n)得到最远点对了 #include<bits/stdc++.h> using namespa ...

最新文章

  1. 可视化-grafana_使用influxDB数据
  2. javascript事件模型框架
  3. 学生成绩管理系统python课程设计,简易学生成绩管理系统Python
  4. Integration testing
  5. astype函数_从Excel到Python:最常用的36个Pandas函数!最完整的Pandas教程!
  6. |洛谷|动态规划|P1164 小A点菜
  7. Web Js 按键事件……Enter提交事件 Enter Js事件
  8. CentOS7 防火墙关闭
  9. Android事件分发 笔记
  10. Nagios(八)—— Nagios Web 端管理工具Nagiosql
  11. 发现身边90%的朋友都是负债累累,是什么情况?
  12. 双网卡绑定--实现负载冗余
  13. 679. 24 点游戏
  14. vue踩坑以及自己的解决办法总结,
  15. ios实现读写锁,AFN的实现
  16. oracle imp仅导入数据
  17. Android DVM简介
  18. Android Service之bindService
  19. 罗克韦尔AB PLC 通过RSLinx Classic与PLC建立通信的具体方法步骤
  20. 【日语】secret base

热门文章

  1. 通达OA任意用户登录复现(最新)
  2. C#,图像二值化(17)——全局阈值的ISODATA算法(亦称作InterMeans法)及其源程序
  3. 做IT精英还是IT民工?
  4. 司法制度类毕业论文文献包含哪些?
  5. 图书馆借阅代码Java_java图书馆管理系统源代码 图书借阅和归还管理
  6. [含文档+PPT+源码等]基于SSM个人财务记账账单收入支出统计管理系统[包运行成功]
  7. Fabric实战(四)-多机部署fabric网络-solo
  8. 《奋斗吧!菜鸟》第三次作业:团队项目的原型设计
  9. 基于SSM的小区缴费系统
  10. 《在Win10下使用DOSBox+MASM32工具包搭建汇编环境》