分散层叠学习小记
大概是处理这样一个问题:
给定 \(n\) 个长为 \(m\) 的序列 \(a_1,a_2,\cdots,a_n\),询问一个点 \(x\) 在所有序列中的前驱 / 后继,要求单次 \(O(n + \log m)\),预处理 \(O(nm)\),空间 \(O(nm)\)。
预处理 \(b\),\(b_1=a_1\),\(b_i\) 由 \(b_{i-1}\) 中偶数下标位置与 \(a_i\) 归并得到,容易证明单个 \(b_i\) 长度 \(\le 2m\)。
以后继为例。
再预处理 \(b_i\) 中每个数其往后第一个在 \(b_{i-1}/a_i\) 中的数,查询时,我们想要知道所有 \(b_i\) 中 \(x\) 的后继,继而可以通过预处理的信息得到 \(a_i\) 中的后继。
对于 \(b_n\) 我们直接二分,递推到 \(b_{i-1}\) 时我们取出预处理的 \(b_{i-1}\) 中的后继,发现最多往前移动一位(被删除的奇数位),于是可以单次 \(O(n + \log m)\)。
本文来自博客园,作者:lnw143,转载请注明原文链接:https://www.cnblogs.com/lnw143/p/19454101

浙公网安备 33010602011771号