盒子
盒子
文章目录
  1. 静态区间第 $k$ 小

整体二分

静态区间第 $k$ 小

考虑查询一个集合的第 $k$ 小

在值域 $[l,r]$ 二分答案 $m$,将 $a_i \le m$ 的元素标为 $1$,$a_i > m$ 的元素标为 $0$

记录 $1$ 的个数为 $s$

  1. 如果 $s \le k$,说明答案在 $[l,m]$

    之后 $a_i > m$ 的元素一直会标成 $0$,故已经没有用了,可以直接删去

  2. 如果 $s>k$,说明答案在 $[m+1,r]$

    之后 $a_i \le m$ 的元素一直会标成 $1$,故已经没有用了,可以直接删去,并 $k \leftarrow k-s$

也就是说,可以通过二分的答案 $m$,来将原序列拆分成两个新的序列,同时也将所有的询问拆分成两类询问

由于是在二分答案,故每个元素或询问只会下放 $O(\log V)$ 次,故总时间复杂度是 $O(n \log n \cdot T)$

期间可以用排序加二分来代替数状数组的操作

实际上这个划分过程可以做到强制在线

实际上这个过程和划分树有一些异曲同工之处(后者取得不是值域的中位数,而是当前序列的中位数)

支持一下
扫一扫,支持nekko
  • 微信扫一扫