第十三关——数据结构

可持续化线段树

对于线段树打标签操作我们则需要新建两个节点表示新的历史

比较常用的是用可持久化线段树来维护权值,然后维护不同区间的权值分布情况

比较经典的例子就是无修改的区间K大值,以这个问题为例子来讲解可持久化线段树的操作。

步骤:

  • 首先如果我们只询问区间[1,n]的k大值我们可以先将各个点的权值离散化

  • 然后建立一颗权值树表示权值的分布状况,那么我们对于每个区间只需要判断左儿子的节点数是否大于k,

  • 然后二分的去找就好了

对于区间的查询则需要建立这个区间的权值树

  • 先建一颗空树,表示什么都没有插入的时候的区间的情况

  • 按照数列的顺序不断的插入这个值,因为权值树满足加减的性质(即区间[l,r]中x值的个数为区间[1,r]中x的个数减去区间[1,l-1]中x的个数)

  • 处理出所有区间为[1,i]的时候的权值树,但是空间会消耗很大。

  • 考虑一次插入,这一次插入改变的值只为包含x的区间的这logn个节点,那么剩下的节点我们可以从上一个历史版本继承过来。(会减小空间)

 

你可能感兴趣的:(第十三关——数据结构)