[学习笔记]分散层叠
咕咕咕
感觉是个挺厉害的东西
首先, 分散层叠顾名思义你可以看做是一个瀑布一样的东西, 一层一层的向下流
模板问题
给你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\) 里, 这样一层一层的向下流就可以做到了
还是挺厉害的
代码就咕了

浙公网安备 33010602011771号