首页 > 编程语言 >Andrew 算法求凸包

Andrew 算法求凸包

时间:2024-07-23 14:50:57浏览次数:10  
标签:node const double Andrew tp stk 算法 return 求凸包

Andrew 算法求凸包

参考资料:

右手定则(baidu.com)

内积和外积 - OI Wiki (oi-wiki.org)

  • \(a\) 与 \(b\) 相对位置
    • \(b\) 在 \(a\) 的逆时针方向: \(a \times b>0\)
    • 顺负逆正(其实就是高中数学对于正负角的定义)

凸包 - OI Wiki (oi-wiki.org)

  • 排序后最小和最大的元素为什么一定在凸包上?
  • 单调栈维护上下凸壳
  • 伪代码

while(右旋){
标记原来的栈顶为不在凸包上
}
标记新点在栈顶上
加入栈中

  • 一般是叉积小于0则不合法(=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;
}

标签:node,const,double,Andrew,tp,stk,算法,return,求凸包
From: https://www.cnblogs.com/superl61/p/18318406

相关文章

  • 算法-代码随想录-哈希表
    有效的字母异位词思路:数组作为一个简单的哈希表,可以用来记录字符串中每个字符出现的次数。可以设置一个数组,第一轮遍历s中的字符,字符每出现一次,在数组对应位置+1。第二轮遍历t中的字符,字符每出现一次,在数组对应位置-1。最后遍历作为哈希表的数组,如果都为0,则说明每个字符出现的......
  • 从零开始学数据结构系列之第四章《prim算法(普里姆算法)总代码》
    文章目录回顾初始化寻找最小权值算法主体总代码往期回顾回顾我们用这张图来进行算法讲解初始化/**vex-存储顶点*weight-存储权值*/typedefstructEdge{charvex;intweight;}Edge;/**开辟数组大小得空间,大小具体为vexNum的个数*......
  • 算法识别(一)--TEA及其魔改
    0x01算法概要TEA(tinyencryptionalgorithm),属于分组算法,每次操作64位数,分成2个4字节无符号整数(unsignedint),密钥128位,为4个4字节无符号整型(unsignedint),delta(unsignedint)一般为0x9e3779b9,进行轮数一般>=32轮.0x02算法实现c实现#include<cstdint>unsigne......
  • 快速学习一个算法,Transformer
    今天给大家介绍一个强大的算法模型,TransformerTransformer模型是由Vaswani等人在2017年提出的一种用于自然语言处理的深度学习模型,特别擅长于处理序列到序列的任务,如机器翻译、文本生成等。今天,我们主要从编码的角度来进行说明。Transformer模型架构Transformer......
  • 【数据结构】排序算法——Lessen1
    Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎~~......
  • 2024“钉耙编程”中国大学生算法设计超级联赛(2)1003
    绝对不模拟的简单魔方要相信题目的提示(直接模拟的代码长达300行),由于魔方的特性,不论如何转动脚上的色块颜色不会变动,只要枚举8个角块看看是否一致即可,枚举角块时需确定访问角块颜色的顺序,例如以3号为顶,后左上访问顺序为123即坐标为\((3,4)->(4,3)-(4,4)\),那么可以通过此角......
  • 素性测试算法
    素数拥有许多特殊的性质,这让它在计算机科学中被广泛应用。例如,著名的RSA加密算法基于两个质数的乘积的难分解性;同时,其正确性基于质数的费马小定理和一些推论。因此,快速判定一个大整数是否是质数是重要的课题。试除法由于质数\(p\)只有\(1\)和\(p\)两个正因数,对于正整......
  • 「代码随想录算法训练营」第十八天 | 二叉树 part8
    669.修剪二叉搜索树题目链接:https://leetcode.cn/problems/trim-a-binary-search-tree/题目难度:中等文章讲解:https://programmercarl.com/0669.修剪二叉搜索树.html视频讲解:https://www.bilibili.com/video/BV17P41177ud?share_source=copy_web题目状态:没有思路,看题解过......
  • [UE 虚幻引擎] DTHmacSha 蓝图HMACSHA加密算法插件说明
    本插件可以在虚幻引擎中使用蓝图对字符串和文件进行HMACSHA加密。1.节点说明HMACSHA一共有5种加密方式,分辨是HMACSHA-1,HMACSHA-224,HMACSHA-256,HMACSHA-384,HMACSHA-512。本插件对每种加密方式提供3个节点,一般节点返回通用值,如7c4a8d09ca3762af61e59520943dc26494f8941b;t......
  • 【视频】Python遗传算法GA优化SVR、ANFIS预测证券指数ISE数据-CSDN博客
    全文链接:https://tecdat.cn/?p=37060本文旨在通过应用多种机器学习技术,对交易所的历史数据进行深入分析和预测。我们帮助客户使用了遗传算法GA优化的支持向量回归(SVR)、自适应神经模糊推理系统(ANFIS)等方法,对数据进行了特征选择、数据预处理、模型训练与评估。实验结果表明,这些方法......