查询第$k$大
正常我们的想法主席树。但是如果对一个询问,我们可以这样操作:将$[ql,qr]$区间内数加入权值树状数组。二分$ans\in[-l,r]$,$p=num[i\leq mid]\leq k$,则在左区$[l,mid]$间的第$k$,不然在右区$[mid+1,r]$间的第$p-k$。
但是如果对于$q$个询问需要新建树状数组,复杂度就$O(qn\log n)$。会发现中间有很多重复的过程。
- 我们只需要将那些$val\leq mid$的进行加入。之后只会对所有需要进入$[l,mid]$产生影响。将这些操作划分左边的操作。
- 而那些$val>mid$或者进入左区间的查询,之后与其无关,只需要划分为右边的操作
- 保证时间顺序不改变
整体二分 $[l,r,L,R]$ 表示答案在 $[l,r]$ 中,与操作 $[L,R]$ 有关(操作 $[L,R]$ 不一定对应原来 $[L,R]$ 的操作)
- 动态第$k$大,就是将它删除再插入,整体二分保证了时间的顺序一致
复杂度都为$O(n\log^2 n)$,但是比树套树常数小。
静态第$k$大
代码
1 |
|