左偏树

前言

左偏树是一种可并堆,顾名思义,它支持快速合并。

定义

定义外界点为孩子数量小于等于 \(2\) 个的节点,\(dis(u)\) 表示节点 \(u\)最近的外节点经过的边数减 \(1\)。特别的,空节点的 \(dis\)\(-1\)

定义节点 \(u\) 权值为 \(val(u)\),左、右儿子分别为 \(ls(u),rs(u)\)。左偏树中可以出现重复的元素。

定义一棵以 \(u\) 为根节点的左偏树,它满足

  • \(dis(ls(u))\ge dis(rs(u))\)
  • 若有左右儿子,则左右子树均为左偏树。
  • \(u\) 为根节点的树是一个堆,即 \(val(u)\le val(ls(u)),val(rs(u))\)

本文的左偏树均为根堆。

性质

可得 \(dis(u)=dis(rs)+1\)

操作

合并

合并是左偏树的基本操作。

设合并两棵左偏树 \(x,y\),合并后根节点为 \(z=mrg(x,y)\),且 \(val(x)\le val(y)\),则取 \(z\gets x,ls(z)=ls(x),rs(z)=mrg(rs(x),y)\)。递归处理即可。

插入

新建一个节点直接合并即可。

删除根

合并根的左右儿子。

删除任意节点

将左右儿子合并替代自己,更新 \(dis\),不满足左偏性质时交换左右儿子。若 \(dis\) 无需更新可直接返回。

可打标记且不改变相对大小的全局操作

给根打标记,操作时下传。

求所在堆的根

可使用并查集维护。

复杂度分析

咕。

posted @ 2024-06-01 10:40  Po7ed  阅读(1)  评论(0编辑  收藏  举报