算法模板——左偏树(可并堆)
时间:2022-05-07
本文章向大家介绍算法模板——左偏树(可并堆),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
实现的功能——输入1 x,将x加入小根堆中;输入2,输出最小值并去在堆中除掉
实现原理——左偏树,这里面维护的是一个小根堆,个人认为其还是没有发挥出左偏树的真正威力——其真正威力在于堆与堆之间可以直接合并,而且复杂度仅为O(logN),在零散插入元素时可以采用本程序中一个个加入的方法,但是当有些题目中预处理多个元素时,则建议通过队列进行合并(别忘了堆与堆之间可以直接合并哦~~~),这样子快一点(详见:《左偏树的特点及其应用》By黄源河),代码量嘛,估计是这几棵常用树里面最短的了,都快和最小生成树差不多了,甚至还可以更短
1 var
2 i,j,k,l,m,n,head:longint;
3 a,lef,rig,fix:array[0..100000] of longint;
4 function min(x,y:longint):longint;inline;
5 begin
6 if x<y then min:=x else min:=y;
7 end;
8 function max(x,y:longint):longint;inline;
9 begin
10 if x>y then max:=x else max:=y;
11 end;
12 procedure swap(var x,y:longint);inline;
13 var z:longint;
14 begin
15 z:=x;x:=y;y:=z;
16 end;
17 procedure merge(var x,y:longint);
18 begin
19 if x=0 then swap(x,y);
20 if y=0 then exit;
21 if a[x]>a[y] then swap(x,y);
22 merge(rig[x],y);
23 fix[x]:=min(fix[lef[x]],fix[rig[x]])+1;
24 if fix[lef[x]]<fix[rig[x]] then swap(lef[x],rig[x]);
25 end;
26 function cuthead(var x:longint):longint;
27 var a1:longint;
28 begin
29 a1:=a[x];
30 merge(lef[x],rig[x]);
31 x:=lef[x];
32 exit(a1);
33 end;
34 begin
35 readln(n);m:=0;head:=0;
36 for i:=1 to n do
37 begin
38 read(j);
39 case j of
40 1:begin
41 readln(k);
42 inc(m);a[m]:=k;l:=m;
43 merge(head,l);
44 end;
45 2:begin
46 readln;
47 writeln(cuthead(head));
48 end;
49 end;
50 end;
51 end.
52
- 如何跨平台在本地开发环境提交MapReduce作业到CDH集群
- 区块链行业的机会
- KEGG数据库的rest API(附带R语言小技巧)
- 如何使用Java代码访问HDFS.docx
- Django CSRF Bypass (CVE-2016-7401) 漏洞分析
- 如何使用Cloudera Manager禁用YARN的HA
- Web Worker 中的 importScripts 和 baseHref 同源策略绕过问题
- 如何使用Java代码访问CDH的Solr服务
- Safari UXSS漏洞分析(CVE-2016-4758)
- Sqoop抽取Hive Parquet表数据到MySQL异常分析
- Hue中使用Oozie创建Ssh工作流时sudo命令执行失败问题分析
- [译]Safari URL重定向漏洞(CVE-2016-4585)利用分析
- Hive中的Timestamp类型日期与Impala中显示不一致分析(补充)
- 百篇(5):FeignClient 在不同场景中的应用
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 记一次 Kafka Producer 性能调优实战
- Kafka 独立消费者
- 【iOS】记录iOS14以及xcode12 遇到的问题
- 如果你还在犹豫要不要入行,请先看看我的IT入坑记【技术创作101训练营】
- Session、Cookie、Token 【浅谈三者之间的那点事】
- Python 微信机器人-20行代码实现斗图功能,简单易懂,全是干货!斗图啦API调用方法
- 浅谈布隆过滤器
- Python 技术篇-获取图片GPS信息,锁定追踪图片拍摄地点、拍摄时间
- 测试工具 - Postman接口测试入门使用手册,Postman如何进行数据关联、自动更新cookies、简单编程
- 白盒测试工具 - sonar的安装、配置与使用入门手册,用sonar检查代码质量实战演示
- Chmod -R 777 / 误操作恢复教程
- 最全总结 | 聊聊 Python 数据处理全家桶(Redis篇)
- 虚拟机安装mikrotik-ROS
- 搬砖武士|手把手教你在容器服务 TKE 上使用 LB直通 Pod
- linux安装snmp服务-ubuntu