主席树小结
主席树,是可持久化线段树中的一种,其作用为用较小的空间时间花费构造出形态相同,状态类似的线段树
因为其插入节点后所构成的新树于原来的树形态完全相同,那么树之间就可以相加减,并且新树除了插入节点之外和以前的树完全一致,所以说将其加减就能将新插入节点单独提取出来,显然,按顺序插入的区间也能提取出来
比如说K-th Number问题 维护一个区间第K小
按顺序插入,直接提取区间线段树查询第K小即可
注意:使用权值线段树,即可按大小查询
或者说动态区间第K小问题,和K-th Number的区别就是带修
若直接按照以前的建树方案按顺序插入,显然每次修改就要更改所有树
注意,原本的建树方案直接维护了前缀和,提取区间简单,但是修改复杂
所以使用树状数组维护前缀和,提取区间较为复杂(log),修改较为简单(log)
还有树上动态区间第K小问题,与上题的差异为将一维序列转化到了树上
主席树维护每个点到根节点的权值,然后会发现每次修改会导致其子节点所对应的线段树的权值变化,用DFS序将其转化为区间修改,所以用区间修改版树状数组即可(差分数列)
最后是求中位数问题
本来求中位数是使用sort,但是若变为区间中位数就不行了
利用wuvin在APIO2018二分专题选讲中的方法,二分一个中位数,然后将原序列转化为1.-1序列,求和即可
显然我们对于每一个可能的中位数直接建一棵线段树,然后区间查询.
就是这么easy