主席树入门+博客推荐
主席树是就是多颗线段树的总结 主席树的结构体中的 \(l\) 和 \(r\) 代表的是这个节点的左右子节点的标号,因为空间优化的原因,他们可能不再符合左子树编号等于 \(rt<<1\) ,右子树编号等于 \(rt<<1|1\) ,这也是我开始比较困惑的一点。在学习主席树之前,需要你很熟悉线段树这个东西,因为主席树的主体是多颗线段树,首先我们来简单的回顾一下线段树的简单特点和性质,我们熟悉的线段树一般是用一个结构体表示一个节点,每个节点有一个编号,节点里面一般有两个变量l, r来表示这个节点维护的区间,然后还有一个区间信息(比如区间最大值,最小值,和等,视具体问题而定),当然如果涉及到区间更新,还有一个add或者lazy叫做延迟标记的东西,然后一般线段树最明显的特点就行,一个父节点的编号是i,那么他的两只儿子节点的编号分别为2 * i(左) , 2 * i + 1(右),注意主席树在这一点有别于一般的线段树,每一个父节点,他的两个儿子节点的编号不一定满足这个关系。 主席树的结构体数组需要开多大呢?根据主席树的空间复杂度(这个我不会,我看的博客上的)是 \(n*logn\) ,看的博客上右开 \(n\) 的 20倍和40倍的,这里还是最好算一下,开40倍就很大了。 POJ 2104 K-th Number ,我也写了关于这个题的博客,代码有注释,可以方便理解。 #include