当前位置: 首页 > news >正文

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))

实例

如果下一个点在右边像这样就这样
(原应从第一个点连了第二点后直接连最右下的点,但我这画错了,致歉)
很明显,将上一个点排出,因为当前的点劣于当前点(当前点在上个点右边)

变成了这样
在这里插入图片描述
发现当前的点还是优于最后一个点(在其右),排出Graham
在上一点的左边,加入在这里插入图片描述
其它的都在左边不在赘述
结果就是:
在这里插入图片描述
有一个很好的演示视频,放在这(看了就去支持那个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学习笔记

前置知识&#xff1a;凸包 摘录oiwiki 在平面上能包含所有给定点的最小凸多边形叫做凸包。 其定义为&#xff1a;对于给定集合 X&#xff0c;所有包含 X 的凸集的交集 S 被称为 X 的 凸包。 说人话就是用一个橡皮筋包含住所有给定点的形态 如图&#xff1a; 正题&#xff1a…...

Elasticsearch Queries

Elasticsearch Compound Queries Elasticsearch 的 Compound Queries 是一种强大的工具&#xff0c;用于组合多个查询子句&#xff0c;以实现更复杂的搜索逻辑。这些查询子句可以是叶查询&#xff08;Leaf Queries&#xff09;或复合查询&#xff08;Compound Queries&#xf…...

利用matlab寻找矩阵中最大值及其位置

目录 一、问题描述1.1 max函数用法1.2 MATLAB中 : : :的作用1.3 ind2sub函数用法 二、实现方法2.1 方法一&#xff1a;max和find2.2 方法二&#xff1a;max和ind2sub2.3 方法对比 三、参考文献 一、问题描述 matlab中求最大值可使用函数max&#xff0c;对于一维向量&#xff0…...

SQL入门到精通 理论+实战 -- 在 MySQL 中学习SQL语言

目录 一、环境准备 1、MySQL 8.0 和 Navicat 下载安装 2、准备好的表和数据文件&#xff1a; 二、SQL语言简述 1、数据库基础概念 2、什么是SQL 3、SQL的分类 4、SQL通用语法 三、DDL&#xff08;Data Definition Language&#xff09;&#xff1a;数据定义语言 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版本 --- 改

前言&#xff1a; 通过实践而发现真理&#xff0c;又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识&#xff0c;又从理性认识而能动地指导革命实践&#xff0c;改造主观世界和客观世界。实践、认识、再实践、再认识&#xff0c;这种形式&#xff0c;循环往…...

并发编程中的常见问题

1 竞态条件 (Race Condition) 定义:竞态条件是指多个线程在访问共享资源时,由于执行顺序的不同导致结果不确定的情况。 示例: public class Counter {private int count = 0;public void increment() {count++;}public int getCount() {return count;} }在多线程环境下,…...

二维前缀和:高效求解矩阵区域和问题

在处理二维矩阵时&#xff0c;频繁计算某一子矩阵的和是一个常见的操作。传统的做法是直接遍历该子矩阵&#xff0c;时间复杂度较高。当矩阵非常大且有大量的查询时&#xff0c;直接计算将变得低效。为了提高效率&#xff0c;我们可以通过 二维前缀和 技巧在常数时间内解决这个…...

鸢尾花书《编程不难》02---学习书本里面的三个案例

文章目录 1.引言2.第一个例子---模拟硬币的投掷结果3.第二个例子---混合两个一元高斯分布的随机数4.第三个例子---线性回归的作图5.关于书中的问题的解决方案 1.引言 今天的这个文章主要是阅读学习鸢尾花书系列的第一本《编程不难》&#xff0c;今天主要是记录下书里面的两个例…...

MySQL(高级特性篇) 13 章——事务基础知识

一、数据库事务概述 事务是数据库区别于文件系统的重要特性之一 &#xff08;1&#xff09;存储引擎支持情况 SHOW ENGINES命令来查看当前MySQL支持的存储引擎都有哪些&#xff0c;以及这些存储引擎是否支持事务能看出在MySQL中&#xff0c;只有InnoDB是支持事务的 &#x…...

CSS Display属性完全指南

CSS Display属性完全指南 引言核心概念常用display值详解1. block&#xff08;块级元素&#xff09;2. inline&#xff08;行内元素&#xff09;3. inline-block&#xff08;行内块级元素&#xff09;4. flex&#xff08;弹性布局&#xff09;5. grid&#xff08;网格布局&…...

【机器学习篇】K-Means 算法详解:从理论到实践的全面解析

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…...

IntelliJ IDEA远程开发代理远程服务器端口(免费内网穿透)

IntelliJ IDEA远程开发代理远程服务器端口&#xff08;免费内网穿透&#xff09;&#xff08;JetBrains家的其他IDE应该也支持&#xff09; 之前看到宇宙第一IDE VS Code好像默认代理了远程的端口&#xff0c;但是一直没找到IDEA的同类功能&#xff0c;这次终于发现了 以Intell…...

内核定时器3-用户空间定时器

用户空间定时器与内核定时器的关系 虽然用户空间定时器和内核定时器在实现上各自独立&#xff0c;但用户空间定时器通常依赖于内核定时器提供的基础设施。以下是具体关系&#xff1a; 依赖性 用户空间定时器的实现基于内核定时器。 例如&#xff0c;POSIX 定时器使用内核的 h…...

C++ 字面量深度解析:从基础到实战进阶

在 C 开发中&#xff0c;字面量&#xff08;Literal&#xff09;不仅是基础语法的一部分&#xff0c;更是提升代码可读性、安全性和性能的关键工具。本文将深入探讨 C 字面量的高级特性、最新标准支持&#xff08;C11/14/17/20&#xff09;以及实际开发中的应用技巧&#xff0c…...

论文paper(更新...)

目录 是否rebuttal&#xff1f;rebuttal 技巧 是否rebuttal&#xff1f; 如果不rebuttal 肯定会拒稿&#xff0c;编辑也会给审稿人发信息&#xff0c;如下&#xff1a; Comment: Thanks for your efforts in reviewing this paper. The authors have neither submitted a rebu…...

变形金刚多元宇宙

1 涉及的公司 1.1 孩之宝HasBro 孩之宝与Takara签订协议后&#xff0c;孩之宝开始使用Takara的专利进行研发。 1.2 日本特佳丽Takara公司 特佳丽Takara Diaclone可变形恐龙的机器人玩具 Microman可变形汽车的机器人玩具 1.3 日本东映TOEI ANIMTION 1.4 美国漫威 为了推广玩具…...

HTTP协议的无状态和无连接

无连接 ①无连接的含义 这里所说的无连接并不是指不连接&#xff0c;客户与服务器之间的HTTP连接是一种一次性连接&#xff0c;它限制每次连接只处理一个请求&#xff0c;当服务器返回本次请求的应答后便立即关闭连接&#xff0c;下次请求再重新建立连接。这种一次性连接主要考…...

ASP.NET代码审计 SQL注入篇(简单记录)

sql注入&#xff0c;全局搜索 Request QueryString ToString() select select * aspx是设计页面&#xff0c;而aspx.cs是类页面&#xff0c;也就是说设计页面用到的类信息在这个页面里面&#xff0c;其实就是把设计和实现分离开来。 源码 using System; using System.Collect…...

毫秒级响应的VoIP中的系统组合推荐

在高并发、低延迟、毫秒级响应的 VoIP 场景中&#xff0c;选择合适的操作系统组合至关重要。以下是针对 Ubuntu linux-lowlatency、CentOS Stream kernel-rt 和 Debian 自定义 PREEMPT_RT 的详细对比及推荐&#xff1a; 1. 系统组合对比 特性Ubuntu linux-lowlatencyCentO…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;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框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 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&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...