动态查询区间第k大

Dynamic Rankings

注:这道题也有树套树和整体二分的做法,这里讲解的是主席树 + 树状数组思路优化。

尝试沿用上一题的思路,思考修改操作如何完成:

考虑到修改操作对每棵权值线段树的影响是:

设修改前的值为w,则[1,x](xi<=x<=n)的线段树都把值域为w的点−1
[1,x](xi<=x<=n)的线段树都把值域为vali的点+1
这样做的时间复杂度过高,我们可以考虑用树状数组的二进制思想进行优化:

T[i]这颗线段树代表[i−lowbit(x)+1,x]这段区间建成的线段树:

修改操作,最多修改log2n颗线段树即可。
查询操作,用不超过2∗log2n颗线段树就能拼(前缀和)出[li,ri]的线段树。
注意,在查询时的代码实现:

用X数组存储拼出[1,x−1]的所有点。
用Y数组存储拼出[1,y]的所有点。
然后用普通主席树的方法,让所有的跟着跳,对位相减即可。

时间复杂度O(nlog2n)O(nlog2n), 空间复杂度O(2n+(n+m)log2n)

HDU 5412 CRB and Queries【整体二分+树状数组】

猜你喜欢

转载自www.cnblogs.com/Accpted/p/11427947.html