HAO的Graham学习笔记
前置知识:凸包
摘录oiwiki
在平面上能包含所有给定点的最小凸多边形叫做凸包。
其定义为:对于给定集合 X,所有包含 X 的凸集的交集 S 被称为 X 的 凸包。
说人话就是用一个橡皮筋包含住所有给定点的形态
如图:
正题:Graham求凸包
过程
Graham求凸包的过程是:
1,选一个点,其它点以它作为标准将其他点进行极角排序
两种方法,建议使用atan2(懒)
atan2用法:atan2(横坐标,纵坐标)(注:以选择的点为原点的坐标)
2,从最低的点开始(这能保证第一个点一定在凸包内)枚举
分成两种情况:
if 上一个点在这个点的左边{将这个点加入答案
}
else{将这个点pop
}
此处可用叉积判断左右,叉积学习
3,连接第一个点与最后一个点
分析时间复杂度
处理时每个点只会一次,即为O(n),n为点数,还有角排序的O(nlog(n)),总体为O(n+nlog(n))
实例
如果下一个点在右边像这样
(原应从第一个点连了第二点后直接连最右下的点,但我这画错了,致歉)
很明显,将上一个点排出,因为当前的点劣于当前点(当前点在上个点右边)
变成了这样

发现当前的点还是优于最后一个点(在其右),排出
在上一点的左边,加入
其它的都在左边不在赘述
结果就是:

有一个很好的演示视频,放在这(看了就去支持那个up吧,sto颓废orz)
演示视频
代码实现
模版
First,初始化每个点的极角度数(此处为atan2实现)
//p是存点的,x是行,y是列,与平面直角坐标系完全相反//p[1]是最低的点,以p[1]为原点for(int i=1;i<=n;i++){p[i].angle=atan2(p[i].x-p[1].x,p[i].y-p[1].y);}
Second,排序(以极角排(大的先),相同就以在p[1]右来排序)
bool cmp(node x,node y){if(x.angle==y.angle){return ju(x,p[1])>ju(y,p[1]);}return x.angle>y.angle;
}
Third 开始处理(以单调栈维护答案)
st[++top]=p[1];for(int i=2;i<=n;i++){while(top>=2&&jiao(st[top]-st[top-1],p[i]-st[top])<0){top--;}st[++top]=p[i];}st[top+1]=p[1];
完整代码
这个代码是P2742的,凸包模版题
请勿 Ctrl-A+Ctrl-C+Ctrl-V 丝滑小连招,请自己了解后手打一遍
#include<bits/stdc++.h>
using namespace std;
struct node{double x,y;double angle;node operator-(const node p)const{return{x-p.x,y-p.y,0};}
}p[100001];
int n;
int s1[10001];
double ju(node x,node y){//求距离 return sqrt((x.y-y.y)*(x.y-y.y)+(y.x-x.x)*(y.x-x.x));
}
bool cmp(node x,node y){//角排序 if(x.angle==y.angle){return ju(x,p[1])>ju(y,p[1]);}return x.angle>y.angle;
}
double jiao(node x,node y){//叉积 return x.x*y.y-x.y*y.x;
}
node st[100001];
int top;
int main(){cin>>n;int k,xx,yy;for(int i=1;i<=n;i++){cin>>p[i].y>>p[i].x;if(i==1){k=i;xx=p[i].x;yy=p[i].y;}if(p[i].x<xx||(p[i].x==xx&&p[i].y<yy)){k=i;xx=p[i].x;yy=p[i].y;}}swap(p[k],p[1]);for(int i=1;i<=n;i++){p[i].angle=atan2(p[i].x-p[1].x,p[i].y-p[1].y);}sort(p+2,p+n+1,cmp);st[++top]=p[1];for(int i=2;i<=n;i++){while(top>=2&&jiao(st[top]-st[top-1],p[i]-st[top])<0){top--;}st[++top]=p[i];}st[top+1]=p[1];double ans=0;for(int i=1;i<=top;i++){ans+=ju(st[i],st[i+1]);
// cout<<st[i].x<<" "<<st[i].y<<endl;}printf("%.2lf",ans);
}
例题:P3829
题意:给你一堆给出的卡片,求其凸包周长(凸包长度包含圆弧长度)
分析第三个样例:

其中的黑色凸包与答案红色部分的长度完全相同,在根据我们小学8年级的知识:多变形的外角和为360度,所以外面的圆弧刚好就是一个圆,答案就等于凸包+一个圆的长度。
代码:我不贴了
预告
可能会出Andrew的笔记,那时会用Andrew写一遍P3829
相关文章:
HAO的Graham学习笔记
前置知识:凸包 摘录oiwiki 在平面上能包含所有给定点的最小凸多边形叫做凸包。 其定义为:对于给定集合 X,所有包含 X 的凸集的交集 S 被称为 X 的 凸包。 说人话就是用一个橡皮筋包含住所有给定点的形态 如图: 正题:…...
Elasticsearch Queries
Elasticsearch Compound Queries Elasticsearch 的 Compound Queries 是一种强大的工具,用于组合多个查询子句,以实现更复杂的搜索逻辑。这些查询子句可以是叶查询(Leaf Queries)或复合查询(Compound Queries…...
利用matlab寻找矩阵中最大值及其位置
目录 一、问题描述1.1 max函数用法1.2 MATLAB中 : : :的作用1.3 ind2sub函数用法 二、实现方法2.1 方法一:max和find2.2 方法二:max和ind2sub2.3 方法对比 三、参考文献 一、问题描述 matlab中求最大值可使用函数max,对于一维向量࿰…...
SQL入门到精通 理论+实战 -- 在 MySQL 中学习SQL语言
目录 一、环境准备 1、MySQL 8.0 和 Navicat 下载安装 2、准备好的表和数据文件: 二、SQL语言简述 1、数据库基础概念 2、什么是SQL 3、SQL的分类 4、SQL通用语法 三、DDL(Data Definition Language):数据定义语言 1、操…...
【智力测试——二分、前缀和、乘法逆元、组合计数】
题目 代码 #include <bits/stdc.h> using namespace std; using ll long long; const int mod 1e9 7; const int N 1e5 10; int r[N], c[N], f[2 * N]; int nr[N], nc[N], nn, nm; int cntr[N], cntc[N]; int n, m, t;void init(int n) {f[0] f[1] 1;for (int i …...
Spring Security(maven项目) 3.0.2.9版本 --- 改
前言: 通过实践而发现真理,又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识,又从理性认识而能动地指导革命实践,改造主观世界和客观世界。实践、认识、再实践、再认识,这种形式,循环往…...
并发编程中的常见问题
1 竞态条件 (Race Condition) 定义:竞态条件是指多个线程在访问共享资源时,由于执行顺序的不同导致结果不确定的情况。 示例: public class Counter {private int count = 0;public void increment() {count++;}public int getCount() {return count;} }在多线程环境下,…...
二维前缀和:高效求解矩阵区域和问题
在处理二维矩阵时,频繁计算某一子矩阵的和是一个常见的操作。传统的做法是直接遍历该子矩阵,时间复杂度较高。当矩阵非常大且有大量的查询时,直接计算将变得低效。为了提高效率,我们可以通过 二维前缀和 技巧在常数时间内解决这个…...
鸢尾花书《编程不难》02---学习书本里面的三个案例
文章目录 1.引言2.第一个例子---模拟硬币的投掷结果3.第二个例子---混合两个一元高斯分布的随机数4.第三个例子---线性回归的作图5.关于书中的问题的解决方案 1.引言 今天的这个文章主要是阅读学习鸢尾花书系列的第一本《编程不难》,今天主要是记录下书里面的两个例…...
MySQL(高级特性篇) 13 章——事务基础知识
一、数据库事务概述 事务是数据库区别于文件系统的重要特性之一 (1)存储引擎支持情况 SHOW ENGINES命令来查看当前MySQL支持的存储引擎都有哪些,以及这些存储引擎是否支持事务能看出在MySQL中,只有InnoDB是支持事务的 &#x…...
CSS Display属性完全指南
CSS Display属性完全指南 引言核心概念常用display值详解1. block(块级元素)2. inline(行内元素)3. inline-block(行内块级元素)4. flex(弹性布局)5. grid(网格布局&…...
【机器学习篇】K-Means 算法详解:从理论到实践的全面解析
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...
IntelliJ IDEA远程开发代理远程服务器端口(免费内网穿透)
IntelliJ IDEA远程开发代理远程服务器端口(免费内网穿透)(JetBrains家的其他IDE应该也支持) 之前看到宇宙第一IDE VS Code好像默认代理了远程的端口,但是一直没找到IDEA的同类功能,这次终于发现了 以Intell…...
内核定时器3-用户空间定时器
用户空间定时器与内核定时器的关系 虽然用户空间定时器和内核定时器在实现上各自独立,但用户空间定时器通常依赖于内核定时器提供的基础设施。以下是具体关系: 依赖性 用户空间定时器的实现基于内核定时器。 例如,POSIX 定时器使用内核的 h…...
C++ 字面量深度解析:从基础到实战进阶
在 C 开发中,字面量(Literal)不仅是基础语法的一部分,更是提升代码可读性、安全性和性能的关键工具。本文将深入探讨 C 字面量的高级特性、最新标准支持(C11/14/17/20)以及实际开发中的应用技巧,…...
论文paper(更新...)
目录 是否rebuttal?rebuttal 技巧 是否rebuttal? 如果不rebuttal 肯定会拒稿,编辑也会给审稿人发信息,如下: Comment: Thanks for your efforts in reviewing this paper. The authors have neither submitted a rebu…...
变形金刚多元宇宙
1 涉及的公司 1.1 孩之宝HasBro 孩之宝与Takara签订协议后,孩之宝开始使用Takara的专利进行研发。 1.2 日本特佳丽Takara公司 特佳丽Takara Diaclone可变形恐龙的机器人玩具 Microman可变形汽车的机器人玩具 1.3 日本东映TOEI ANIMTION 1.4 美国漫威 为了推广玩具…...
HTTP协议的无状态和无连接
无连接 ①无连接的含义 这里所说的无连接并不是指不连接,客户与服务器之间的HTTP连接是一种一次性连接,它限制每次连接只处理一个请求,当服务器返回本次请求的应答后便立即关闭连接,下次请求再重新建立连接。这种一次性连接主要考…...
ASP.NET代码审计 SQL注入篇(简单记录)
sql注入,全局搜索 Request QueryString ToString() select select * aspx是设计页面,而aspx.cs是类页面,也就是说设计页面用到的类信息在这个页面里面,其实就是把设计和实现分离开来。 源码 using System; using System.Collect…...
毫秒级响应的VoIP中的系统组合推荐
在高并发、低延迟、毫秒级响应的 VoIP 场景中,选择合适的操作系统组合至关重要。以下是针对 Ubuntu linux-lowlatency、CentOS Stream kernel-rt 和 Debian 自定义 PREEMPT_RT 的详细对比及推荐: 1. 系统组合对比 特性Ubuntu linux-lowlatencyCentO…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
