区间等价类分治入门
区间等价类分治入门
等价类分治的基本入门题:
给定一个序列 \(a_1, \dots, a_n\),另外给定排列 \(p_1, p_2, \dots, p_n\)。
现在有 \(m\) 次询问,每次给定 \([l, r]\),设所有满足 \(p_i \in [l, r]\) 的下标为 \(i_1, \dots, i_{r- l + 1}\),求 \(a_{i_1} \circ a_{i_2} \circ \dots \circ a_{i_{r - l + 1}}\)(按原数组中的顺序)。
这里 \(\circ\) 是一种满足结合律的运算符,并且存在幺元 \(\epsilon\) 满足 \(\epsilon \circ x = x \circ \epsilon = x\)。
视 \(\circ\) 用时为 \(O(1)\)。
显然有一种 \(O(n\sqrt{m} \log n)\) 的莫队 \(+\) 线段树做法。不过该做法可能会被卡常。
这个题的基本方法是将序列按长度为 \(B\) 分块。那么对于一个块来说,本质不同的询问种类只有 \(O(B^2)\) 种。如果我们能在 \(O(B^2)\) 内处理完一个块的值,那么总复杂度就是 \(O(nB + \frac{nm}{B})\),在 \(B = O(\sqrt{m})\) 时取到最优复杂度 \(O(n\sqrt{m})\)。
设 \(T(B)\) 表示处理完规模为 \(B\) 的等价类的所有 \(O(B^2)\) 个询问的最优时间复杂度。
对于一个等价类 \([l, r]\),我们可以对其分治。设 \(\mathit{mid} = \frac{l + r}{2}\),我们可以将其拆为 \([l, \mathit{mid}], (\mathit{mid}, r]\) 两个规模为 \(\frac{B}{2}\) 的子等价类,对其分别递归处理。然后我们枚举原等价类的所有本质不同询问,容易做到 \(O(1)\) 在子等价类中查询对应询问答案。那么总复杂度就是 \(T(B) = 2T(\frac{B}{2}) + O(B^2) = O(B^2)\)。
因此该复杂度上界能够取到。其实代码比较短,但我没写过。
也有一些别的做法,不过这些做法的复杂度会稍微高一点点。
例如若我们在 \(O(B^2\log n)\) 的复杂度内解决所有询问(例如线段树),那么总复杂度为 \(O(nB\log n + \frac{nm}{B})\),在 \(B = O(\sqrt{\frac{m}{\log n}})\) 时取到最优复杂度 \(O(n\sqrt{m\log n})\)。
再者,如果我们仅分治两层,设两层的块大小为 \(B_1, B_2\),在内层用暴力 \(O(B_1^3)\) 算,那么总复杂度为 \(O(nB_1^2 + \frac{nB_2^2}{B_1} + \frac{nm}{B_2})\),在 \(B_1 = O(m^{\frac{2}{7}}), B_2 = O(m^{\frac{3}{7}})\) 时取到最优复杂度 \(O(nm^{\frac{4}{7}})\)。
如果内层用 \(O(B_1^2\log n)\),则在 \(B_1 = O(\frac{\sqrt{m}}{(\log n)^{\frac{3}{4}}}), B_2 = O(\frac{\sqrt{m}}{\sqrt[4]{\log n}})\) 时取到最优复杂度 \(O(n\sqrt{m} (\log n)^{\frac{1}{4}})\)。显然这个东西常数会比暴力大。
这个问题的一个拓展是,每组询问再额外给定一个下标区间 \([\mathit{il}, \mathit{ir}]\),要求只保留下标区间内,\(p_i\) 属于 \([l, r]\) 的 \(a_i\)。我们对散块暴力即可,这部分复杂度 \(O(mB)\)。若有此类限制,则 \(B\) 必须取 \(O(\sqrt{m})\) 以维持平衡。
等价类分治模板题 P5611 卡空间,要求空间线性。那么只能使用最正经的等价类分治,对每个等价类单独处理。没写
另有一题 QOJ10779,我们对该题的值域进行等价类分治即可。采用 \(O(nm^{\frac{4}{7}})\) 可以得到一个较快的做法。目前(20260605)为最优解。Code


浙公网安备 33010602011771号