[学习笔记]分散层叠

咕咕咕
感觉是个挺厉害的东西
首先, 分散层叠顾名思义你可以看做是一个瀑布一样的东西, 一层一层的向下流
模板问题

给你n个长度为k的有序序列, 每次给出一个数x, 求出他在所有序列的后继

分散层叠是一个 \(O(nk) - O(n + log k)\) 的算法

设一开始给出的n个序列是 \(L_i\)
现在我们构造一个新的序列 \(M\)

\[\begin{cases} M_n = L_n;\\ M_i = merge(L_{i}, M_{i + 1}中的偶数下标) \end{cases} \]

然后在归并的时候处理出 \(M_i\) 的每一个元素在 \(L_i\)\(M_{i + 1}\) 的后继
现在对于每一个询问x, 先二分出他在 \(M_1\) 中的后继 \(y\), 那么 \(y\)\(L_1\) 的后继就是x在 \(L_1\) 的后继。
继续, 我们找到y在 \(M_2\) 的后继. 此时x在 \(M_2\) 的后继与 y在\(M_2\)的后继之间的差一定只有 O(1) 个元素, 因为 \(M_2\)有偶数位的元素在 \(M_1\) 里, 这样一层一层的向下流就可以做到了

还是挺厉害的
代码就咕了

posted @ 2021-02-21 11:05  Zcus  阅读(198)  评论(1)    收藏  举报