主席树入门
主席树,也叫做可持久化线段树,准确来说,应该叫做可持久化权值线段树,因为其中的每一颗树都是一颗权值线段树。
所谓权值线段树,就是指线段树的叶子节点保存的是当前值的个数。这样说起来比较抽象,下面用具体例子来简单阐述。
如有数列:2 1 2 5 1 1 1 3,不难统计出,数列中数字1出现了4次,数字2出现了2次,数字3、数字5都出现了1次,对于这个数列,我们可以说 a[1]=4,a[2]=2,a[3]=1,a[4]=0,a[5]=1 a [ 1 ] = 4 , a [ 2 ] = 2 , a [ 3 ] = 1 , a [ 4 ] = 0 , a [ 5 ] = 1 。如果放在权值线段树种, a[i] a [ i ] 中的下标 i i 不再是对应的数值,而是对应叶子节点的编号了。但是道理是一样的。
为了实现可持久化,就要保存树的历史版本。最自然的想法当然是每进行一次修改,就新建一颗线段树,这样的空间复杂度显然是不能够接受的。通过观察不难发现,每次进行单点修改,发生变化的只有从叶子节点到根节点这一条链上的节点,换句话说,只有