题解 P3377 【【模板】左偏树(可并堆)】
所谓的左偏树,是一种可并堆的实现。
这种数据结构能够支持高效的堆合并,但是不支持查询节点等操作,因此不同于平衡树,它的结构是不平衡的。
左偏树满足如下两条基本性质:
1. 堆的性质
这也就是说左偏树每个节点的值都大于/小于它父节点的值。
2. 对于任意节点,其左儿子距离不小于右儿子距离(左偏性质)
这里需要先引入距离的概念。
一个节点的距离,指它到后代中最近的外节点(儿子数量少于2)所经过的边数。
有了上面两条性质,我们不难证明下面这条性质:
3. 对于任意节点,其距离等于其右儿子距离+1
其正确性是显然的,因为左儿子距离大于等于右儿子距离,所以最近的外节点必然在右儿子里。
有了这些性质,我们就可以着手与其操作了。
合并操作
合并操作将两个左偏树合并在一起。
假如两棵树中有空树,那么返回另一颗即可。
否则取根节点更大/小的那一颗,然后将另一颗并到他的右儿子上去。
由于并完之后右儿子距离可能比左儿子大,所以我们需要特判是否交换儿子。
最后还要更新一下根节点的距离。
int merge (int x,int y) {
if (!x||!y) return x+y;
if (val[x]>val[y]) swap(x,y);
heap[x].rs=merge(heap[x].rs,y);
if (heap[heap[x].rs].size>heap[heap[x].ls].size) swap(heap[x].ls,heap[x].rs);
heap[x].dis=heap[heap[x].rs].dis+1;
return x;
}
删除操作
没删么好说的,直接将左右儿子并起来就可以了。
int erase (int x) {
x=merge(heap[x].ls,heap[x].rs);
return x;
}
复杂度证明
最后是左偏树合并操作的复杂度证明。
由于我们每一次递归都合并右子树,而一颗树的距离取决于其右子树。
所以最后一颗树被分解的次数不会超过其距离。
也就是说,不会超过\(log(n+1)-1\)次。
那么在最坏情况下,合并复杂度为\(O(log(n_a+1)+log(n_b+1)-2)\)即\(O(log(a)+log(b))\)也就是\(O(log(ab))\)
题解 P3377 【【模板】左偏树(可并堆)】的更多相关文章
- 洛谷 P3377 模板左偏树
题目:https://www.luogu.org/problemnew/show/P3377 左偏树的模板题: 加深了我对空 merge 的理解: 结构体的编号就是原序列的位置. 代码如下: #inc ...
- BZOJ1455 罗马游戏 左偏树 可并堆
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1455 题意概括 n个人,2种操作. 一种是合并两个人团,一种是杀死某一个人团的最弱的人. 题解 左 ...
- [note]左偏树(可并堆)
左偏树(可并堆)https://www.luogu.org/problemnew/show/P3377 题目描述 一开始有N个小根堆,每个堆包含且仅包含一个数.接下来需要支持两种操作: 操作1: 1 ...
- bzoj2809 [Apio2012]dispatching——左偏树(可并堆)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2809 思路有点暴力和贪心,就是 dfs 枚举每个点作为管理者: 当然它的子树中派遣出去的忍者 ...
- [luogu3377][左偏树(可并堆)]
题目链接 思路 左偏树的模板题,参考左偏树学习笔记 对于这道题我是用一个并查集维护出了哪些点是在同一棵树上,也可以直接log的往上跳寻找根节点 代码 #include<cstdio> #i ...
- HDU3031 To Be Or Not To Be 左偏树 可并堆
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - HDU3031 题意概括 喜羊羊和灰太狼要比赛. 有R次比赛. 对于每次比赛,首先输入n,m,n表示喜羊羊和灰 ...
- HDU5818 Joint Stacks 左偏树,可并堆
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - HDU5818 题意概括 有两个栈,有3种操作. 第一种是往其中一个栈加入一个数: 第二种是取出其中一个栈的顶 ...
- BZOJ2333 [SCOI2011]棘手的操作 堆 左偏树 可并堆
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ2333 题意概括 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i ...
- BZOJ 4003: [JLOI2015]城池攻占 左偏树 可并堆
https://www.lydsy.com/JudgeOnline/problem.php?id=4003 感觉就是……普通的堆啊(暴论),因为这个堆是通过递归往右堆里加一个新堆或者新节点的,所以要始 ...
- Monkey King(左偏树 可并堆)
我们知道如果要我们给一个序列排序,按照某种大小顺序关系,我们很容易想到优先队列,的确很方便,但是优先队列也有解决不了的问题,当题目要求你把两个优先队列合并的时候,这就实现不了了 优先队列只有插入 删除 ...
随机推荐
- 设置编码格式为utf8
response.setCharacterEncoding("UTF-8"); 在Servlet2.3中是不行的,至少要2.4版本才可以,如果低于2.4版本,可以用如下办法: re ...
- Java 微信公众号上传永久素材的方法
Java 微信公众号上传永久素材的方法 学习了:http://blog.csdn.net/u013791374/article/details/53258275 膜拜一下,源码如下: @Request ...
- HDOJ 5099 Comparison of Android versions 坑题
现场赛的时候错了十四次. . ... Comparison of Android versions Time Limit: 2000/1000 MS (Java/Others) Memory L ...
- 使用Dropzone上传图片及回显演示样例
一.图片上传所涉及到的问题 1.HTML页面中引入这么一段代码 <div class="row"> <div class="col-md-12" ...
- java删除文件夹及子目录
package test; import java.io.FileNotFoundException; import java.io.IOException; import java.io.File; ...
- 一个JavaWeb项目中使用的部分技术
-- 2015年8月8日 1. Web框架: Spring+ SpringMVC + MyBatis Spring: 作为容器.工厂,用于解耦以及管理对象生命周期. 整合各类框架和依赖. MVC : ...
- intelliJ idea运行新的test功能时,报错:class not found "....." empty test suite
转自:https://blog.csdn.net/u012560212/article/details/75037578
- TCP/IP协议族简介
OSI网络分层介绍 网络结构的标准模型是OSI模型,由国际互联网标准化组织定义的网络分层模型.虽然目前没有完全按照这种模型实现的网络协议栈,但是学习这个模型对于我们理解网络协议还是很有帮助的. 1.O ...
- maven 项目加载本地JAR
将jar安装到本地的maven仓库 1.首先确定本地有maven环境. 2.安装本地jar 模板: mvn install:install-file -Dfile=<path-to-file& ...
- tomcat指定JDK版本
在windows环境下以批处理文件方式启动tomcat,只要运行<CATALINA_HOME>/bin/startup.bat这个文件,就可以启动Tomcat. 在启动时,startup. ...