主席树是一种可持久化线段树,当初是由名叫hjt的神犇发明的。(故名。)
基础思路:
以单点修改为例:
考虑朴素做法,每进行一次修改操作就建一棵新线段树。
可以发现,由于每次修改只改变一条链的值,上述做法可以优化为这样:
每次修改时,只新建被影响的链,其余部分共用上一版本的,和上述做法等价。
( r t i rt_i rti表示第i
次的根。)
“共用”的方法:
所有主席树节点共用一个内存池nod tr[N*log(q)];
此时,一个节点的左右子节点可指向任意版本的任意节点。指向被共享节点即可。
以修改4为例。
代码讲解:
change部分
变量:
f-> 当前位置的历史节点。(参考线段树)
L,R->当前位置节点所代表的区间左右端点。
x, d->要修改位置及增加值。
解释一下返