权值线段树

就是指线段树的叶子节点保存的是当前值的个数。

权值线段树一般支持以下三个操作:

  • insert

  • erase/remove

  • query

贴一个alphadalao的题解。


主席树

主席树,也叫做可持久化线段树,准确来说,应该叫做可持久化权值线段树,因为其中的每一颗树都是一颗权值线段树。

经典例题:查询区间第k小。

主席树是静态的。

为了实现可持久化,就要保存树的历史版本。最自然的想法当然是每进行一次修改,就新建一颗线段树,这样的空间复杂度显然是不能够接受的。通过观察不难发现,每次进行单点修改,发生变化的只有从叶子节点到根节点这一条链上的节点,换句话说,只有 $logN$ 个节点发生了变化,而其他的节点都可以重用,没有必要新建。


看图非常好理解。

超棒的讲解

然后就是一些实现上的细节了。

  • 先建立不同的根,接下来只要修改 $logN$ 个节点,查询从根节点开始即可。
  • 数组大约要开 $MlogN+4logN$ 大小。