主席树入门

推荐博客 : 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 .

还有一点就是主席树在建树前要离散化。

posted @ 2018-04-13 22:35  楼主好菜啊  阅读(160)  评论(0编辑  收藏  举报