title : 配对堆与左偏树
date : 2021-8-22
tags : 数据结构,ACM
配对堆
简介
配对堆(pairing heap),支持插入,查询/删除最小值,合并,修改等操作,跑得比较快,但不能可持久化。
操作
合并
直接把根节点权值较大的那个配对堆设成另一个的儿子即可。
插入
新元素可视为一个配对堆,与原堆合并即可。
删除最小值(复杂)
若把根节点的儿子都一个个合并到一起,复杂度会退化到O(n)
Eileen保证均摊复杂度为O(logn),我们需要把儿子从左往右两两配对。
Node* merges(Node* x) {
if (x == nullptr || x->xd == nullptr)
return x; // 如果该树为空或他没有兄弟(即他的父亲的儿子数小于2),就直接return。
Node *a = x->xd, *b = a->xd; // a:x的一个兄弟,b:x的另一个兄弟
x->xd = a->xd = nullptr;