主席树入门
推荐博客 : https://blog.csdn.net/creatorx/article/details/75446472
: https://www.cnblogs.com/zyf0163/p/4749042.html
早在很久之前就听过主席树这个名词,不过一直没有去学,当时想的是先把线段树学明白了,今天想学这个是因为一场 CF。
主席树其实就是由 n 棵权值线段树组成,并且你要保留着 i 棵线段树的根节点,这 i 棵线段树其实就可以看成是不同的历史的版本,现在如果想让我们查询某一段区间时,我们直接做差就可以求,其实对于每一个根节点我们都可以看成是一棵线段树,与线段树的操作是一样的。
主席树的结构体:
struct node { ll l, r; ll sum; }t[maxn*20];
l , r 表示当前节点的左右儿子的编号,其不满足线段树的结点编号关系,sum 表示当前结点内有多少个点值。
另外,区别于线段树的一点就是它需要开辟的结点是 20 倍,区别于线段树,为什么呢?因为每次建树的时候都是新增一条链,那么你需要新开的结点就是 logn 个结点,所以总的结点数就是 maxn*logn .
还有一点就是主席树在建树前要离散化。
东北日出西边雨 道是无情却有情