左偏树(左翼堆)

news/2024/11/5 14:47:28/文章来源:https://www.cnblogs.com/Lion-Wu/p/18527873

一般的二叉堆,要对其进行合并操作,最朴素的方法是每个元素逐一与另一个堆合并,即使是启发式,也是 O(n)的复杂度。

然而,左偏树可以做到 O(log n),因为他并不是暴力合并,而是基于深度,而深度最多为 log。

这里,我们引入一个变量 dist,指的是这个节点到叶子节点的距离。特别地,叶子节点的 dist 为 0,空节点的 dist 为 -1。

证明:一个有 n 个节点的左偏树,根节点(也就是 dist 最大的节点)的 dist 不大于 log(n + 1) + 1。

假设根节点的 dist 为 k,那么树上最少有 2 ^ (k + 1) - 1 个节点,那么有 n >= 2 ^ (k + 1) - 1。

所以 log(n + 1) + 1 >= k 。

这样一来,复杂度基于高度的合并就是正确的了。

左偏树的核心操作在于合并,而合并操作的核心在于 merge() 函数。

merge() 函数的参数是两个待合并的树(当然也是左偏树)的根节点,而返回值是合并后新的根节点。

这是一种递归式的操作。

每次对比两个参数,令更小的(视情况而定)作为新的根节点,较大的根节点再与新根节点的右儿子合并(因为树是左偏的,右子树才是决定 dist 的子树,保证 log 级别的复杂度),反复递归。

P3377 【模板】左偏树/可并堆

点击查看代码
#include <bits/stdc++.h>
using namespace std;
template <typename T> inline void read(T &x)
{x = 0; bool f = 0; char ch = getchar();while('0' > ch || ch > '9') { if(ch == '-') f = !f; ch = getchar(); }while('0' <= ch && ch <= '9') { x = (x << 1) + (x << 3) + (ch ^ 48); ch = getchar(); }x = f ? -x : x; return;
}
template <typename T> inline void print(T x)
{if(x < 0) putchar('-'), x = -x;if(x > 9) print(x / 10);putchar(x % 10 + '0'); return;
}
const int N = 1e5 + 10;
int n, m;
int a[N], fa[N], lc[N], rc[N], dist[N], del[N];
int find(int x)
{if(fa[x] == x) return x;return fa[x] = find(fa[x]);
}
int merge(int x, int y)
{if(!x || !y) return x + y;if(a[x] > a[y] || a[x] == a[y] && x > y) swap(x, y);rc[x] = merge(rc[x], y);fa[rc[x]] = x;if(dist[lc[x]] < dist[rc[x]]) swap(lc[x], rc[x]);dist[x] = dist[rc[x]] + 1;return x;
}
void Pop(int x)
{del[x] = 1;fa[lc[x]] = lc[x], fa[rc[x]] = rc[x];fa[x] = fa[lc[x]] = fa[rc[x]] = merge(lc[x], rc[x]);lc[x] = rc[x] = dist[x] = 0;
}
int main()
{dist[0] = -1;read(n); read(m);for(int i = 1; i <= n; i ++) read(a[i]), fa[i] = i;int op, x, y;for(int i = 1; i <= m; i ++){read(op);if(op == 1){read(x); read(y);if(del[x] || del[y]) continue;x = find(x); y = find(y);if(x != y) fa[x] = fa[y] = merge(x, y);}else if(op == 2){read(x);if(del[x]) print(-1), putchar('\n');else{x = find(x);print(a[x]);putchar('\n');Pop(x);}}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/827152.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

易基因: RNA-BS揭示动物不同发育阶段的mRNA m5C甲基化图谱和调控机制|Nat Commun

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 m5C是已知的RNA修饰之一,但其在mRNA中的发育动态、功能和进化仍然知之甚少。最初报道m5C在mRNA中普遍存在,但后来认识到许多最初被鉴定的位点可能假阳性。准确和系统地检测转录组范围mRNA m5C水平一直具有挑…

硬件设计布线原则

1. 高速电流不应流经低速器件 高速电路的地返回信号也会造成地平面的电压发生变 化。对于地平面或接地走线的感抗,V = Ldi/dt ;对于地平面或接地走线的阻抗,V = RI 。与数字电流一样,高 速电路的地平面或接地走线经过模拟器件时,地线上的电压变化会改变信 号链中信号和地之…

11.9

[实验任务一]:女娲造人 使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数M,则返回一个Man对象,如果传入参数W,则返回一个Woman对象,如果传入参数R,则返回一个Robot对象。请用程序设计实现上述场景。 实验要求:画出对应的类图;提交源代码;package uml;// Per…

IT监控(进阶篇):运维监控系统手把手部署教学

前言: 注:系统需必须是centos7.4-7.9或redhat7.4-7.9且无其他业务的,不存在nginx、php、mysql、perseusZ_server、ansibles、postgresql等软件,否则一些脚本探测到已安装则会跳过配置文件的修改导致后续安装的系统功能异常。 top #查看系统配置最低要求CPU8核心以上,内存8…

RocketMQ实现优惠券秒杀

RocketMQ实现优惠券秒杀的简单思路秒杀架构图准备数据库 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0;-- ---------------------------- -- Table structure for goods -- ---------------------------- DROP TABLE IF EXISTS `goods`; CREATE TABLE `goods` (`id` int(11…

2024.11.5 人工智能在小学教育教学中的应用

【知识小课堂1】概念与历史 人工智能(Artificial Intelligence),引文缩写为AI。它是研究、开发用于模拟延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。 (一)学科范畴 人工智能是一门边沿学科,属于自然科学、社会科学、技术科学三向交叉学科。 (二)涉及…

S7-1200对V90 PN进行位置控制的三种方法

S7-1200系列PLC通过PROFINET与V90 PN伺服驱动器搭配进行位置控制,实现的方法主要有以下三种: • 方法一、在PLC中组态位置轴工艺对象,V90使用标准报文3,通过MC_Power、MC_MoveAbsolute等PLC Open标准程序块进行控制, 这种控制方式属于中央控制方式(位置控制在PLC中计算,驱…

11.5 人工智能学习内容

人工智能(Artificial Intel ligence) 引文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。 (一)学科范畴 人工智能是一门边沿学科,属于自然科学、社会科学、技术科学三向交叉学科。 (二)涉及学科与领域 哲学和认…

Nuxt.js 应用中的 nitro:build:public-assets 事件钩子详解

title: Nuxt.js 应用中的 nitro:build:public-assets 事件钩子详解 date: 2024/11/5 updated: 2024/11/5 author: cmdragon excerpt: nitro:build:public-assets 是 Nuxt 3 中的一个生命周期钩子,在复制公共资产之后调用。该钩子使开发者能够在构建 Nitro 服务器之前,对公…

FB284功能说明

FB284功能说明带增量编码器V90,使用参考挡块+编码器零脉冲方式回零时,参考挡块回零开关接到哪里,怎样配置 回零开关连接到一个PLC的数字量输入点,PLC内编程将其状态关联到FB284功能块ConfigEPos输入引脚的bit6。 (1)将V90参数P29240设置为1(选择参考挡块+零脉冲方式回零)…

《图解设计模式》 第九部分 避免浪费

第二十章 Flyweight 模式public class BigcharFactory{//这里对使用到的内容进行了缓存private HashMap pool = new HashMap();//有则直接取,无则创建并保存到缓存。public synchronized BigChar getBigChar(char charname){BigChar bc = (BigChar) pool.get("" + c…