Andrew 算法求凸包
Andrew 算法求凸包
参考资料:
- \(a\) 与 \(b\) 相对位置
- \(b\) 在 \(a\) 的逆时针方向: \(a \times b>0\)
- 顺负逆正(其实就是高中数学对于正负角的定义)
- 伪代码
while(右旋){
标记原来的栈顶为不在凸包上
}
标记新点在栈顶上
加入栈中
- 一般是叉积小于0则不合法(=0是平的,但合法)
二维凸包
定义
凸多边形
凸多边形是指所有内角大小都在 \([0,\pi]\) 范围内的 简单多边形。
凸包
在平面上能包含所有给定点的最小凸多边形叫做凸包。
实际上可以理解为用一个橡皮筋包含住所有给定点的形态。
凸包用最小的周长围住了给定的所有点。如果一个凹多边形围住了所有的点,它的周长一定不是最小,如下图。根据三角不等式,凸多边形在周长上一定是最优的。

Andrew 算法求凸包
过程:
1、首先以 \(x\) 为第一关键字, \(y\) 为第二关键字排序
2、显然排序后最小的元素和最大的元素一定在凸包上。而且因为是凸多边形,我们如果从一个点出发逆时针走,轨迹总是「左拐」的,一旦出现右拐,就说明这一段不在凸包上。因此我们可以用一个单调栈来维护上下凸壳。
因为从左向右看,上下凸壳所旋转的方向不同,为了让单调栈起作用,我们首先 升序枚举 求出下凸壳,然后 降序 求出上凸壳。
- 左右旋的判定:叉积的正负(左旋为正角,右旋为负角,0证明是平的一段)
二维凸包模板:Luogu P2742 Fencing the Cows
#include<bits/stdc++.h>
#define F(i,l,r) for(int i(l);i<=r;++i)
#define G(i,r,l) for(int i(r);i>=l;--i)
#define double long double
using namespace std;
using ll = long long;
const int N=1e5+105;
struct node{
double x,y;
node operator - (const node &o)const{
node z=(node){x-o.x,y-o.y};
return z;
}
double operator * (const node &o)const{
return x*o.y-y*o.x;
}
bool operator < (const node &o)const{
return x==o.x ? y<o.y : x<o.x;
}
}w[N];
double dis(node a){
return __builtin_sqrt(a.x*a.x+a.y*a.y);
}
int tp=0,n;
int stk[N<<1];
bool used[N];
double ans=0;
signed main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin>>n; F(i,1,n) cin>>w[i].x>>w[i].y;
sort(w+1,w+n+1);
stk[++tp]=1;//used不打标记方便最后封闭
F(i,2,n){
while(tp>=2 && (w[stk[tp]]-w[stk[tp-1]])*(w[i]-w[stk[tp]])<0) used[stk[tp--]]=0;
//注意叉积小于0,一定不能写成小于等于!
used[i]=1;
stk[++tp]=i;
}
G(i,n,1){
if(used[i]) continue;
while(tp>=2 && (w[stk[tp]]-w[stk[tp-1]])*(w[i]-w[stk[tp]])<0) used[stk[tp--]]=0;
used[i]=1;
stk[++tp]=i;
}
F(i,1,tp-1) ans+=dis(w[stk[i+1]]-w[stk[i]]);//凸包周长的求法
ans+=dis(w[stk[1]]-w[stk[tp]]);
cout<<fixed<<setprecision(2)<<ans<<"\n";
return 0;
}
Andrew 算法求凸包的更多相关文章
- 图解 Andrew 算法求凸包
前言 Andrew 算法可以在 \(O(n\log n)\) 的时间复杂度通过单调栈分别求出散点的上凸壳和下凸壳,来求出平面上一些点的凸包. 看懂这篇博客,大家需要掌握: 基础计算几何知识 单调栈 凸 ...
- (模板)graham扫描法、andrew算法求凸包
凸包算法讲解:Click Here 题目链接:https://vjudge.net/problem/POJ-1113 题意:简化下题意即求凸包的周长+2×PI×r. 思路:用graham求凸包,模板是 ...
- Andrew算法求二维凸包-学习笔记
凸包的概念 首先,引入凸包的概念: (有点窄的时候...图片右边可能会被吞,拉开图片看就可以了) 大概长这个样子: 那么,给定一些散点,如何快速地求出凸包呢(用在凸包上的点来表示凸包) Andrew算 ...
- LA 4728 旋转卡壳算法求凸包的最大直径
#include<iostream> #include<cstdio> #include<cmath> #include<vector> #includ ...
- nyoj-78-圈水池(Graham算法求凸包)
题目链接 /* Name:nyoj-78-圈水池 Copyright: Author: Date: 2018/4/27 9:52:48 Description: Graham求凸包 zyj大佬的模板, ...
- [poj1113][Wall] (水平序+graham算法 求凸包)
Description Once upon a time there was a greedy King who ordered his chief Architect to build a wall ...
- POJ 2187 Beauty Contest【旋转卡壳求凸包直径】
链接: http://poj.org/problem?id=2187 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22013#probl ...
- 旋转卡壳(求凸包直径)学习笔记 | 题解 P1452 [USACO03FALL]Beauty Contest G /【模板】旋转卡壳
前言 旋转卡壳(Rotating Calipers)可以在凸包上维护许多有用的信息,最常见的就是凸包直径(平面最远点对). 注意:本文不介绍所谓的 "人类智慧" 乱搞做法. 算法流 ...
- 计算几何 二维凸包问题 Andrew算法
凸包:把给定点包围在内部的.面积最小的凸多边形. Andrew算法是Graham算法的变种,速度更快稳定性也更好. 首先把全部点排序.依照第一keywordx第二keywordy从小到大排序,删除反复 ...
- Beauty Contest(graham求凸包算法)
Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 25256 Accepted: 7756 Description Bess ...
随机推荐
- 【CMake系列】10-cmake测试 ctest
cmake作为一个强大的构建系统指导工具,同时也提供了测试功能,可用于项目的单元测试等,也可以与其他测试框架协作,如googletest,共同完成项目开发中的测试工作,本节我们就来学习 如何借助cma ...
- ubuntu16.04/CentOS 7自动以root身份登录桌面
ubuntu16.04 1.首先设置root用户密码: # sudo passwd root 输入普通用户密码,再输入root用户密码: 2.启用登录时的root选项: # 编辑50-ubuntu.c ...
- MySQL数据库基本操作以及使用
MySQL数据库 操纵数据库 查看数据库 show databases; 创建数据库 create database <database_name>; 删除数据库 drop databas ...
- docker启动一个不停止的centos系统容器
启动的镜像后加上/usr/sbin/init ,前提是镜像中没有设置entrypoint
- Docker高级:Redis集群实战!4主4从缩容到3主3从,怎么处理?
在上一篇,我们学会了redis集群的扩容.从3主3从扩容到4主4从. 那么,接着,活动过去了.流量没有那么大了.需要缩容了.从4主4从缩容到3主3从了.那么这个时候又该怎么处理呢? PS本系列:< ...
- C语言浮点数转字符串实现函数
C语言浮点数转字符串可用库函数sprintf,此处为编写的简单函数. 小数部分最多显示六位. pOut:输出字符串缓冲区 f:浮点数值 isize:输出字符串缓冲区大小 char * Funftoa( ...
- seata 下载及安装
分布式事务 参考文章: 分布式事务实战方案汇总 https://www.cnblogs.com/yizhiamumu/p/16625677.html 分布式事务原理及解决方案案例https://www ...
- Go 编程-mysql数据库操作
一.环境准备 在Go语言中连接MySQL数据库通常使用database/sql包配合一个MySQL驱动,比如github.com/go-sql-driver/mysql 安装github.com/go ...
- CSS – Font / Text 属性
前言 之前学 W3Schools 时记入过一些 W3Schools 学习笔记 (1) – CSS Fonts. 由于太简单就没有另外写一篇, 现在感觉内容比较整齐了, 所以整理一篇出来. 属性 fon ...
- MDC – Work with Framework & Customize
前言 在 MDC – Material Design, Angular Material, MDC, MWC, Lit 的关系 中, 我有提到基于 MDC 的 Framework 生态有多糟糕. 但它 ...