P3835 【模板】可持久化平衡树
好久没有打平衡树了,赶紧来复习一下,平衡树这种东西还是很有用的,可以很灵活地解决一些问题。
fhq_treap
这道题是可持久化的权值平衡树,支持以下几个操作
1、 插入 xxx
2、 删除 xxx(若有多个相同的数,应只删除一个,如果没有请忽略该操作)
3、 查询 xxx 的排名(排名定义为比当前数小的数的个数 +1+1+1)
4、查询排名为 xxx 的数
5、 求 xxx 的前驱(前驱定义为小于 xxx,且最大的数,如不存在输出-1)
6、求 xxx 的后继(后继定义为大于 xxx,且最小的数,如不存在输出-1)
对于fhq_treap基本上所有操作都是依赖于split和merge完成的,还有一些操作是依靠基本的遍历,就是在树上二分处理了。
插入删除都是直接split和merge,查询排名就是split然后查看siz,查询排名为k的数,就是遍历过程中二分,查询前驱就是split后查询最大的数,查询后继就是split后查询最小的数。
还有一个可持久化的关键就是,每次split和merge一旦需要利用到新的信息,就新建一个节点储存,可以发现这样新建的节点个数是与深度同阶的。