配对堆模板

[算法]优先队列之配对堆 配对堆的核心要义在于合并,只要掌握到合并的精髓就能很快的手撸一个配对堆。由于配对堆的插入复杂度只有常数级别,在通常情况下弹出最小值的性能也会由于二叉堆(Java、Python等语言中优先队列的默认实现),所以在做Prim时会有优势。 阅读详情

配对堆是一种可并堆

题意:两种操作,合并两个堆或者查询一个堆的最小值,n≤106n\leq 10^6n≤106

Pairing−HeapPairing-HeapPairing−Heap还挺好写的,不过并没有传说中那么快
这里没有Decrease−KeyDecrease-KeyDecrease−Key的代码,说一下大概怎么实现
额外记录一个FatherFatherFather域,执行Decrease−KeyDecrease-KeyDecrease−Key的时候,把该节点xxx的子树抽出来(只是将FatherxFather_xFatherx​设为000而不变动FatherxFather_xFatherx​的结构)
让后和根节点合并,当Pop−MinPop-MinPop−Min的时候,如果发现一个儿子的FatherFatherFather不是自己那么就不把他加入合并的队列中,这样不影响时间复杂度
时间复杂度,除了Pop−MinPop-MinPop−Min都是O(1)O(1)O(1)的,Pop−MinPop-MinPop−Min应该是均摊O(log⁡ n)O(\log\ n)O(log n)
这玩意比左偏树还好写,也比左偏树快

#include<stdio.h>
#define N 1000010
#define mid (l+r>>1)
using namespace std;
int n,m,b[N],c,f[N],d[N],rt[N];
struct tree{ int v,x,s,r; } s[N];
inline int gf(int x){
	for(;x^f[x];x=f[x]=f[f[x]]); return x;
}
inline int merge(int x,int y){
	if(s[x].v>s[y].v) x^=y^=x^=y;
	s[y].r=s[x].s; s[x].s=y; s[x].r=0; return x;
}
inline int cdq(int l,int r){
	if(l==r) return b[l];
	return merge(cdq(l,mid),cdq(mid+1,r));
}
inline int pop(int x){
	if(!s[x].s) return 0; c=0;
	for(int y=s[x].s;y;y=s[y].r) b[++c]=y;
	return cdq(1,c);
}
int main(){
	scanf("%d%d",&n,&m);
	for(int x,i=1;i<=n;++i){
		scanf("%d",&x); s[i]=(tree){x,i,0,0}; rt[i]=f[i]=i;
	}
	for(int o,x,y;m--;){
		scanf("%d%d",&o,&x);
		if(o>1){
			if(d[x]){ puts("-1"); continue; }
			x=gf(x); printf("%d\n",s[rt[x]].v);
			d[s[rt[x]].x]=1; rt[x]=pop(rt[x]);
		} else {
			scanf("%d",&y);
			if(d[x] || d[y]) continue;
			x=gf(x); y=gf(y);
			if(x!=y){
				f[y]=x; rt[x]=merge(rt[x],rt[y]);
			}
		}
	}
}
数据结构与算法题目及C++解答 前言 题目主要按照类型进行整理,包括leetcode,nowcoder等网站,对于可以使用多种方法的题目,不重复列举。推荐书籍《数据结构与算法分析--C++语言描述》第四版。 本文中所有源代码及博客中其他文章的VS源代码均在github:https://github.com/AnkangH,根据名称检索即可。 1.排序算法 SortAlgorithm 排序算法的源码见博客内排序算法的文章。... 阅读详情

相关推荐

配对堆Pairing Heap

前言 最近做一道Dijkstra的题目,因为边数实在太大了(10910910^9),用STL的priority_queue直接超时(事实上还会MLE)。有同学写配对堆的。刚好很久没学习新的数据结构了,就趁着这个机会补一补。 配对堆 配对堆 Pairing Heap 是一种实现简单、均摊复杂度优越的堆数据结构,由Michael Fredman、罗伯特·塞奇威克、Daniel Sleator...

CaptainSlow 3663

配对堆学习笔记

由于博主很弱,只会打板子,请见谅 配对堆 一种极其好写又极其快速的堆 先看复杂度 空间复杂度:O(n)O(n)O(n) 时间复杂度: 插入:O(1)O(1)O(1) 合并:O(1)O(1)O(1) 查询最值:O(1)O(1)O(1) 删除元素:O(logn)O(logn)O(logn) 修改元素:O(1)或O(logn)?O(1)或O(logn)?O(1)或O(logn)?反正就是O(O(O(玄学...

qq_42722211的博客 1293

pbds库学习笔记(优先队列、平衡树、哈希表)

pbds库(优先队列、平衡树、哈希表) 目录pbds库(优先队列、平衡树、哈希表)前言概述priority_queue优先队列概述参数堆的基本操作的函数对比STL新增函数modify修改Dijkstra最短路径演示join合并与自定义仿函数类的结合使用tree平衡树概述参数基本操作的方法对比STL中新增的函数find_by_order(k):求平衡树内排名为`k`的值是多少order_of_key(x):求x的排名lower_bound(x):求大于等于x的最小值upper_bound(x):求大于x的最小

Gh0st_Lx的博客 8294

数据结构——配对堆

配对堆是一种低时间复杂度的数据结构,其最重要的算法是删除操作。

霜-哀的博客 397

C++手写链表/栈/队列/二叉树全套可运行代码,含CMake构建和IDEA配置

一套开箱即用的C++数据结构实现合集,覆盖单向链表、双向链表、顺序栈、链式栈、循环队列、链式队列、二叉树(含先序/中序/后序递归与非递归遍历、层序遍历、查找、插入、删除)。所有结构均封装为独立类,接口清晰,main.cpp提供完整调用示例。项目自带CMakeLists.txt,支持Linux/macOS/Windows下用g++或Clang一键编译;已预置JetBrains IDEA工程配置(.idea目录及.iml、xml文件),打开即编码;.gitignore已过滤编译中间文件和IDE缓存。代码采用C+

fern8的博客 247

每天一个优秀提示词学习收藏 - 文本创作篇(二)

宝子们,今天不藏私啦!我把这段时间四处搜罗、潜心钻研出来的文本创作 Prompt 提示词大礼包双手奉上,这可都是能让你的 AI 创作水平原地起飞的干货!走过路过不要错过,赶紧码住,开启你的 AI 创作进阶之旅吧!

2397

配对堆(Pairing Heap)

配对堆(Pairing Heap)是一个简单实用的min-heap结构(当然也可以做成max-heap)。它是一颗多路树(multiway tree),类似于Leftist Heap和Skew Heap,但是与Binomial Tree和Fibonacci Heap不一样。它的基

ljsspace的专栏 2万+

HUMAnN 3.0 (alpha)安装及使用

文章目录简介安装数据库下载运行参考 简介 安装 conda install humann humann_test (~1 minute) 数据库下载 humann_databases --download chocophlan full /path/to/databases --update-config yes humann_databases --download uniref uniref90_diamond /path/to/databases --update-config yes humann_

dys的博客 9503

assass_cannotin的超级配对堆模板

template&lt;class T,int maxsize,bool compare(const T &amp;a,const T &amp;b)&gt;class Pairing_Heap { private: int nxxt[maxsize],to[maxsize],head[maxsize],fa[maxsize],Root,node[maxsize],node_index,H...

assass_cannotin的博客 722

Elasticsearch连接中断:深入解析Connection reset by peer问题及优化策略

本文深入解析Elasticsearch连接中断问题,特别是Connection reset by peer错误的成因与解决方案。从TCP层的心跳机制到客户端与服务端的配置差异,详细介绍了网络不稳定、防火墙拦截等常见原因,并提供了六种优化策略,包括KeepAlive调整、TCP参数调优和智能重试机制等,帮助提升Elasticsearch连接的稳定性。

weixin_42546392的博客 410

三维重建Fusion中的TSDF算法通俗描述

看个视频 https://www.youtube.com/watch?v=8M_-lSYqACo 这是mobilefusion的视频,大家先了解一下,看到在三维重建的时候外面有个长方体包围盒了吗? 数据准备: 我们不同角度拍摄的RGB图、深度图和相应的pose.txt。 步骤: 1.建立长方体包围盒 要建立一个长方体包围盒。让所有的三维点都在这个长方体里面。 假设z方向垂直相机。 很明显,x,y方...

qq_30339595的博客 1万+

手打配对堆模板(支持push, pop, top, join)

常数较二叉堆小。 采用 new、delete 分配内存,不喜勿喷。 支持任意类型(需定义 operator< 或传入比较器)(需要默认构造函数) 如有错请指正!谢谢! template<typename T, typename Comp = less<T>> class pairing_heap { public: typedef Comp...

weixin_30819163的博客 119

【人工智能 Open AI】程序员怎样提升研发效率?从技术、业务、项目管理等等多个方面来阐述。

程序员要想提升研发效率,需要从技术、业务、项目管理等多方面着手,多靠工具配合实践实现,从而提升研发效率。

AI天才研究院 5526

【ZOJ2334】Monkey King

题目大意有 n(n≤105)n(n≤10^5) 只猴子,初始每只猴子为自己猴群的猴王,每只猴子有一个初始的力量值。这些猴子会有 mm 次会面。每次两只猴子 x,yx,y 会面,若 x,yx,y 属于同一个猴群输出 −1−1 ,否则将 x,yx,y 所在猴群的猴王的力量值减半,然后合并这两个猴群。新猴群中力量值最高的为猴王。输出新猴王的力量值。简要分析我们需要一种数据结构维护元素,支持快速合并,查找最

LYXin's Blog 837

使用Simulink进行带通滤波器的设计与仿真研究

摘要:本文介绍利用Simulink设计和仿真带通滤波器的方法。通过定义系统需求(保留100-500Hz信号),创建包含多频信号源、加法器和巴特沃斯滤波器的模型,重点展示滤波器频率选择特性。详细步骤包括模块配置、参数设置(中心频率300Hz、带宽400Hz)、信号连接及可视化分析。实验验证了带通滤波器有效提取目标频段信号的能力,为复杂信号处理系统开发提供基础框架。所需工具为MATLAB R2023a和DSPSystemToolbox。

xiaoheshang_123的博客 325

YOLO11-pose关键点检测:训练实战篇 | 自己数据集从labelme标注到生成yolo格式的关键点数据以及训练教程

教会你如何用自己的数据集转换成对应格式的数据集以及如何训练YOLO11-pose关键点检测

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 5416

配对堆

配对堆采用左儿子和右兄弟的表示方法。存在额外的链,如果节点是最左儿子,则链指向父节点,如果不是,则指向左兄弟。把这个数据成员叫做prev。 配对堆的基本操作有merge、insert、deleteMin、decreaseKey。合并时让较大根的子堆成为另一个最左的儿子。如下图所示: insert操作返回Position对象,传给decreaseKey操作使用。insert操作是mer

blubluhao的博客 1446

CANoe制作网关实现CAN(FD)报文故障注入(报文长度/timeout/信号错误/E2E)2

CANoe制作网关实现CAN报文故障注入(报文长度/timeout/信号错误/E2E) 2.新建CANoe工程 3.透传功能 4.故障注入panel面板 5.CAPL代码 5.1故障注入开始、停止、定时 5.2DLC故障注入 5.3 Timeout故障注入 5.4 信号故障注入

天赐好车的博客 3673

bzoj3040: 最短路(road)

这题看题目,TYB大佬说肯定不是最短路。。 然而一打开,提示就写着最短路。。 于是就写啊 一开始用dij+stl的普通priority_queue 然后MLE了于是上网找了一下原因,发现是同一个点进栈太多。。 于是发现又一个很强的东西——配对堆。。 据说除了修改logn,其他都是O(1),感觉很劲啊!! 去学了一波。。感觉其实也没怎么学。。主要应该时要背代码然后呢,网上有一个直接用pr

OZY的博客 527

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

浅谈堆(Heap)

Heap定义二叉堆 定义 堆是一颗特殊的树,树中每个节点的值都 大/小大 / 小大/小 于其子节点。 每个节点值大于其子节点的,被称为大根堆。 每个节点值小于其子节点的,被称为小根堆。 我们习惯性将 二叉堆二叉堆二叉堆 简称为 堆堆堆。 也因此,在许多地方对堆都有这样的描述: 堆(Heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵完全二叉树的数组对象。堆(Heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵完全二叉树的数组对象。堆(Heap)是计算机科学

NOW I GOT ONE WAY 843

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

BZOJ 3040 最短路(road) Pairing-Heap优化Dijkstra

题目大意:给定n个点m条边的图,求1~n的最短路 n 首先鄙视一下用STL的人 既然要用STL还来水这题干嘛 不服来辩 题目上说要用高效的堆来优化Dijkstra 于是我们自然而然就会想到斐波那契堆 但是那东西真的不是很好写 于是我们有很高效的替代品——Pairing-Heap(配对堆) 这东西真的很好写(除了手写栈以外,一个节点有多个儿子所以手写了栈) 首先Pairing-Heap有几个

世界 2922

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

bzoj3040 最短路+配对堆优化

3040: 最短路(road) Time Limit:60 SecMemory Limit:200 MBSubmit:1859Solved:564[Submit][Status][Discuss] Description N个点,M条边的有向图,求点1到点N的最短路(保证存在)。1<=N<=1000000,1<=M<=10000000 ...

weixin_30919571的博客 208
上一篇: 各种杂题合集
下一篇: 序列求和V2
扩展的灰
博客等级 码龄12年 60粉丝 342原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值