分散层叠算法

板子:分散层叠算法(Fractional Cascading)

\(L_k\) 为原来的第 \(k\) 个序列, \(M_k\) 为新的第 \(k\) 个序列,这里要按 \(k\) 从大到小构造 \(M_k\)

\(M_k\) 中的一个元素 \(M_k[i]\) 除了本身的数值外还有记录两个信息。一个是在 \(L_k\) 中第一个 \(\geq M_k[i]\) 的位置;另一个是比较奇怪的信息(并不完全准确,最后使用的需要修正),即在 \(M_{k+1}\) 中隔两个选一个关键点,这些关键点中第一个 \(\geq M_k[i]\) 的位置。

当进行一次询问的时候,在 \(M_1\) 中找到第一个 \(\geq x\) 的位置 \(M_1[i]\) ,用第一个信息求出在 \(L_1\) 上的答案,然后用第二个信息跳到 \(M_1\) 上,由于可能跳到的位置的前一个位置才是真正的答案,所以要判断一下,可以证明再往前一个一定不是,这样做复杂度就是 \(O(\log n+k)\) 的。

posted @ 2023-06-15 21:55  ruizhangj  阅读(73)  评论(0)    收藏  举报