主席树 总结

终于要总结一波主席树了。主席树太神奇了。。

首先,主席树是什么?

我的理解是,主席树首先是一颗颗地线段树,每一颗线段树都记录了不同时间的状态(这样就实现可持续化啦)。 举个例子, 有一个序列, 我们每次需要向线段树中插入序列中的一个数, 当插入第一个数的时候,就会生成一颗线段树, 然后插入第二个数的时候,就会生成第二颗线段树,第二颗线段树不仅具有第一颗线段树的值,而且还在第一颗树的基础上插入了第二个数,这两颗线段树逻辑上彼此独立。然后,以此类推。。


然后,主席树有哪些性质? ###

  1. 首先一个最重要的性质!!! 它是若干个线段树组成的对不对!!
  2. 然后更重要的性质!!! 主席树维护的是前缀和对不对!!!
  3. 然后最重要的性质!! 不同线段树的相同区间可以加减对不对!!,因为它维护的是前缀和啊, 减出来的就是区间值对不对!!!

让我们画张图

比如这就是一颗线段树
https://img-blog.csdn.net/20150902133719398
那么如果我要再建一颗线段树怎么办呢?
像这样https://img-blog.csdn.net/20150902133828235
这里的红色的就是和第一个线段树不同的地方。

为什么要这样呢?

省内存啊!!
若干颗线段树的话空间肯定吃不消啊, 所以这样就利用了重复利用。。省了一下空间。。 但是虽然这样。。主席树消耗的空间还是很大。

可以用来干什么呢

才疏学浅。。 只知道可以求第K大数。。。

下面附上习题:
POJ 2104 && POJ 2761 (静态区间第k大,主席树)
ZOJ 2112 Dynamic Rankings (动态第k大,树状数组套主席树)
SPOJ 3267. D-query (主席树,查询区间有多少个不相同的数)
SPOJ 10628. Count on a tree (树上第k大,LCA+主席树)

你可能感兴趣的:(总结)