所谓的左偏树,是一种可并堆的实现。

这种数据结构能够支持高效的堆合并,但是不支持查询节点等操作,因此不同于平衡树,它的结构是不平衡的。

左偏树满足如下两条基本性质:

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 【【模板】左偏树(可并堆)】的更多相关文章

  1. 洛谷 P3377 模板左偏树

    题目:https://www.luogu.org/problemnew/show/P3377 左偏树的模板题: 加深了我对空 merge 的理解: 结构体的编号就是原序列的位置. 代码如下: #inc ...

  2. BZOJ1455 罗马游戏 左偏树 可并堆

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1455 题意概括 n个人,2种操作. 一种是合并两个人团,一种是杀死某一个人团的最弱的人. 题解 左 ...

  3. [note]左偏树(可并堆)

    左偏树(可并堆)https://www.luogu.org/problemnew/show/P3377 题目描述 一开始有N个小根堆,每个堆包含且仅包含一个数.接下来需要支持两种操作: 操作1: 1 ...

  4. bzoj2809 [Apio2012]dispatching——左偏树(可并堆)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2809 思路有点暴力和贪心,就是 dfs 枚举每个点作为管理者: 当然它的子树中派遣出去的忍者 ...

  5. [luogu3377][左偏树(可并堆)]

    题目链接 思路 左偏树的模板题,参考左偏树学习笔记 对于这道题我是用一个并查集维护出了哪些点是在同一棵树上,也可以直接log的往上跳寻找根节点 代码 #include<cstdio> #i ...

  6. HDU3031 To Be Or Not To Be 左偏树 可并堆

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - HDU3031 题意概括 喜羊羊和灰太狼要比赛. 有R次比赛. 对于每次比赛,首先输入n,m,n表示喜羊羊和灰 ...

  7. HDU5818 Joint Stacks 左偏树,可并堆

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - HDU5818 题意概括 有两个栈,有3种操作. 第一种是往其中一个栈加入一个数: 第二种是取出其中一个栈的顶 ...

  8. BZOJ2333 [SCOI2011]棘手的操作 堆 左偏树 可并堆

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ2333 题意概括 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i ...

  9. BZOJ 4003: [JLOI2015]城池攻占 左偏树 可并堆

    https://www.lydsy.com/JudgeOnline/problem.php?id=4003 感觉就是……普通的堆啊(暴论),因为这个堆是通过递归往右堆里加一个新堆或者新节点的,所以要始 ...

  10. Monkey King(左偏树 可并堆)

    我们知道如果要我们给一个序列排序,按照某种大小顺序关系,我们很容易想到优先队列,的确很方便,但是优先队列也有解决不了的问题,当题目要求你把两个优先队列合并的时候,这就实现不了了 优先队列只有插入 删除 ...

随机推荐

  1. Github+Jekyll 搭建个人网站详细教程

    GitHub搭建个人网站,大家在网上一搜能搜到一大把的教程,但是大部分都讲的差不多,并不能满足自己想搭建的网站详细需求.我之前在搭建本站的时候也是查了较多资料,学习了下jekyll语法,参考了几个主题 ...

  2. 2014年spark开发人员大赛火热进行中!

    "发现最有正能量的网络达人".Spark开发人员大赛火热进行! watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd3d0dHoxOTc0/ ...

  3. [Angular] Service Worker Version Management

    If our PWA application has a new version including some fixes and new features. By default, when you ...

  4. An internal error occurred during: &quot;Building workspace&quot;. java.lang.StackOverflowError

    1 错误描写叙述 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveW91MjNoYWk0NQ==/font/5a6L5L2T/fontsize/400/fi ...

  5. javascript——从「最被误解的语言」到「最流行的语言」

    JavaScript曾是"世界上最被误解的语言".由于它担负太多的特性.包含糟糕的交互和失败的设计,但随着Ajax的到来.JavaScript"从最受误解的编程语言演变为 ...

  6. NHibernate之旅(14):探索NHibernate中使用视图

    本节内容 引入 1.持久化类 2.映射文件 3.測试 结语 引入 在数据库操作中,我们除了对表操作,还有视图.存储过程等操作,这一篇和下篇来学习这些内容.这篇我们来学习怎样在NHibernate中使用 ...

  7. __FUNCTION__, __LINE__ 有助于debug的宏定义

    __FUNCTION__, __LINE__ 今天无意之间看到一段代码,里面有这样一个片段: if (!interface) { err ("%s - error, can't find d ...

  8. java中文件路径读取

    windows下 1)相对路径 public static final String TestDataExcelFilePath="src/omstestdata.xlsx"; 2 ...

  9. DNS递归查询和迭代查询的差别

    转载地址:http://blog.csdn.net/wuchuanpingstone/article/details/6720723 递归查询和迭代查询的差别 (1)递归查询 递归查询是一种DNS s ...

  10. Linux下配置httpd服务

    第一步拷贝 cp /usr/local/apache2/bin/apachectl /etc/rc.d/init.d/httpd 第二步,修改 vim /etc/rc.d/init.d/httpd # ...