题目链接

如图计算上凸包时判断C1,C2,C3C_1,C_2,C_3C1​,C2​,C3​显然C3C_3C3​是经过A,BA,BA,B的上凸包
可以发现只需要通过A,BA,BA,B即可判断,通过观察可以发现C3y−AyC3x−Ax<=By−AyBx−Ax\frac{C_{3y}-A_{y}}{C_{3x}-A_x}<=\frac{B_y-A_y}{B_x-A_x}C3x​−Ax​C3y​−Ay​​<=Bx​−Ax​By​−Ay​​时为上凸包
即(C3y−Ay)∗(Bx−Ax)−(C3x−Ax)∗(By−Ay)<=0(C_{3y}-A_y)*(B_x-A_x)-(C_{3x}-A_x)*(B_y-A_y)<=0(C3y​−Ay​)∗(Bx​−Ax​)−(C3x​−Ax​)∗(By​−Ay​)<=0
但需注意有些数据需要去重之后相等的情况才可以算作弹出情况
计算下凸包时可利用上凸包的来算,因为可将q[t-1]作为相对原点的位置

#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
#include <iomanip>
#define all(a) a.begin(),a.end()
using namespace std;
using ll = long long ;
struct node{double x,y;bool operator<(const node&p)const{return x==p.x?y<p.y:x<p.x;}node operator-(const node&p)const{return {x-p.x,y-p.y};}double operator*(const node&p)const{///crossreturn x*p.y-y*p.x;}bool operator==(const node&p)const{return x==p.x&&y==p.y;}
};
double dis(node &a,node &b){return sqrt(pow(a.x-b.x,2)+pow(a.y-b.y,2));
}
bool vis[10010];
int q[10010];
signed main()
{ios::sync_with_stdio(false);int n;cin>>n;vector<node>a(n);for(auto &[x,y]:a) cin>>x>>y;sort(all(a));//a.erase(unique(a.begin(),a.end()),a.end());int t=0;for(int i=0;i<a.size();i++){///up convex hullwhile(t>1&&(a[q[t]]-a[q[t-1]])*(a[i]-a[q[t-1]])>0) vis[q[t--]]=false;q[++t]=i;vis[i]=true;}vis[0]=false;for(int i=a.size()-1;i>=0;i--){if(vis[i])continue ;while(t>1&&(a[q[t]]-a[q[t-1]])*(a[i]-a[q[t-1]])>0)t--;q[++t]=i;}double ans=0;for(int i=1;i<t;i++)ans+=dis(a[q[i]],a[q[i+1]]);cout<<fixed<<setprecision(2)<<ans;
}

题目链接
计算旋转卡壳时必须采用面积法,不可采用点点间因为点点之间距离不一定是连续的
如一条平行线与圆相交有两个点时,距离可能会先减小后增大

while(abs(area(a[q[i]],a[q[i%t+1]],a[q[j]]))<abs(area(a[q[i]],a[q[i%t+1]],a[q[j%t+1]])))j=j%t+1;ans=max(ans,dis(a[q[i]],a[q[j]]));ans=max(ans,dis(a[q[i%t+1]],a[q[j]]));ans=max(ans,dis(a[q[i%t+1]],a[q[j%t+1]]));ans=max(ans,dis(a[q[i]],a[q[j%t+1]]));

此处需要四次取最大值前两次取最大值显而易见,后两次是当两个area相等时不代表dis(a[q[i]],a[q[j]])一定比dis(a[q[i%t+1]],a[j%t+1])大

#include <bits/stdc++.h>
using namespace std;
using ll = long long ;
struct node{ll x,y;bool operator<(const node&p)const{return x==p.x?y<p.y:x<p.x;}node operator-(const node&p)const{return {x-p.x,y-p.y};}ll operator*(const node&p)const{return x*p.y-y*p.x;}
}a[100010];
ll dis(const node&a,const node&b){return pow(a.x-b.x,2)+pow(a.y-b.y,2);
}
int q[100010];
bool vis[100010];
ll area(const node&a,const node&b,const node&c){return (a-b)*(a-c);
}
int main()
{int n;cin>>n;for(int i=0;i<n;i++)cin>>a[i].x>>a[i].y;sort(a,a+n);int t=0;for(int i=0;i<n;i++){while(t>1&&(a[q[t]]-a[q[t-1]])*(a[i]-a[q[t-1]])>0)vis[q[t--]]=false;q[++t]=i;vis[i]=true;}vis[0]=false;for(int i=n-1;i>=0;i--){if(vis[i])continue;while(t>1&&(a[q[t]]-a[q[t-1]])*(a[i]-a[q[t-1]])>0)t--;q[++t]=i;}ll ans=0;for(int i=1,j=1;i<=t;i++){while(abs(area(a[q[i]],a[q[i%t+1]],a[q[j]]))<abs(area(a[q[i]],a[q[i%t+1]],a[q[j%t+1]])))j=j%t+1;ans=max(ans,dis(a[q[i]],a[q[j]]));ans=max(ans,dis(a[q[i%t+1]],a[q[j]]));ans=max(ans,dis(a[q[i%t+1]],a[q[j%t+1]]));ans=max(ans,dis(a[q[i]],a[q[j%t+1]]));}cout<<ans;
}

凸包旋转卡壳(andrew)相关推荐

  1. hdu2202 凸包+旋转卡壳

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

  2. POJ 2187 凸包+旋转卡壳

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

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

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

  4. Beauty Contest(凸包 + 旋转卡壳(模板))

    Beauty Contest 直接跑一个凸包,然后跑一跑旋转卡壳,求最大值就行了. /*Author : lifehappy */ #include <cstdio> #include & ...

  5. 【BZOJ1185】【HNOI2007】最小矩形覆盖(凸包+旋转卡壳)

    传送门 题意:求最小矩阵覆盖 有这样一个结论:矩阵一定有一条边在凸包上(不会证) 那可以枚举每条边 同时旋转卡壳 只是这时不只维护一个对踵点对,同时在左右侧再维护一个最远点 可以发现左右最远点一定是和 ...

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

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

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

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

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

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

  9. 凸包问题--旋转卡壳

    前情提要: 1978年,M.I.Shamos在论文<Computational Ceometry>中介绍了一种寻找凸多边形直径的线性算法. Shamos的算法就像绕着多边形旋转一对卡壳,因 ...

最新文章

  1. 在循环中正确找到对应DOM元素的索引
  2. UA SIE545 优化理论基础2 凸函数 概念 理论 总结
  3. backbone.js入门
  4. html文件用safari打开方式,如何使用openURL()读取在safari中打开的html文件 - c#代码 - 源码查...
  5. windows adb shell 乱码
  6. 【317】python 指定浏览器打开网页 / 文件
  7. python哪个更强大_Ruby和Python哪个更强大?学习分析
  8. jmeter 控制偏离_Jmeter 笔记(1)-安装 基本组件
  9. cartographer探秘第四章之代码解析(七)--- Cartographer_ros
  10. 基于eNSP的校园网设计的仿真模拟
  11. 易基因|植物中m6A甲基化酶调节机制:组成、功能和进化
  12. Python实现日周月排行榜
  13. 红米、小米 开发者选项
  14. python程序turtle雪人_用turtle画一个雪人
  15. 关于百度文库举报功能的吐槽
  16. LLM系列 | 01: 亲测ChatGPT最强竞品Claude,且无需翻墙、注册简单、免手机号
  17. Java并发体系-第二阶段-锁与同步-[1]-【万字文系列】
  18. java毕业生设计中小型连锁超市配送中心配送管理计算机源码+系统+mysql+调试部署+lw
  19. python二级题库 第四套
  20. Python汉字转换成拼音

热门文章

  1. EPICS教程3 -- 输入/输出控制器(IOC)的创建
  2. CENTOS上的网络安全工具(十六)容器特色的Linux操作
  3. APP开发商城时,常说三级分销,你知道什么是分销机制吗?
  4. 从大厂裸辞后,面阿里、字节全都挂掉,连货拉拉都不要自己...
  5. 【C#基础】输入一个字符,判定它是什么类型的字符(大写字母,小写字母,数字或者其它字符)
  6. 在这里,看到未来——2013微软技术节印象
  7. OpenGL配置glut64位和glut32位,英伟达 安全 下载地址 免费
  8. 字节跳动自研万亿级图数据库 图计算实践
  9. HTB_Responder 综合靶机 菜菜被虐现场实录
  10. 关于WM_COMMAND与WM_NOTIFY