The Method of Four Russians 四毛子
The Method of Four Russians
又名“四毛子算法”。概括来讲是一种分块后对小块的相同情况合并之后处理小块内,块间另行处理的算法。
一个典中点的例子是 \(\pm1\ \text{RMQ}\),我们考虑块大小为 \(B\),这样的话块间我们使用 \(\text{ST}\) 表,块内一共只有 \(2^B\) 种情况,预处理即可,\(O(n+B2^B+\frac{n}{B}\log\frac{n}{B})-O(1)\),取 \(B=\frac{\log n}{2}\) 即得 \(O(n)-O(1)\)。
这个东西容易扩展到任意 \(\text{RMQ}\),具体来说,我们建笛卡尔树转成 \(\text{LCA}\) 问题,之后再转成 \(\pm1\ \text{RMQ}\)。
当然,特定的这种算法没啥卵用,但是这种思想很不错,我们常常能去掉一个 \(\log\)。
给你 \(n\) 个长度均为 \(n\) 的 \(01\) 串,分别表示第数 \(j\) 在不在 \(i\) 内。对于每两个集合,输出它们之间是否有包含关系。
\(n\le 5000\)。
显然我们可以有一个 \(O(\frac{n^3}{w})\) 算法,接下来我们把它优化一个 \(\log\)。
仍然考虑分成大小为 \(B\) 的块,倘若我们对每个块处理出每个集合的超集集合,我们只需要把这 \(\frac{n}{B}\) 个集合交一下就得到答案。这部分是 \(O(\frac{n^3}{Bw})\)。
考虑怎么处理这个“超集集合”。
我们发现每个块内只有 \(2^B\) 种取值,考虑先处理出每种取值都有谁,然后跑一个类似 \(\text{FMT}\) 的东西即可。这部分是 \(O(\frac{n}{B}\cdot B2^B\cdot \frac{n}{w})=O(\frac{n^2B}{w})\)。
但是这时候你发现这是 shaber。我们不需要 \(\text{FMT}\),只需要预处理出某一位上是 \(1\) 的都有谁,然后递推 lowbit 取交即可。这部分是 \(O(\frac{n}{B}(nB+2^B\frac{n}{w}))\)。
假如采用前一种做法,我们好像要取 \(B=W(n)\),其中 \(W\) 是 Lambert W Function(就是 \(xe^x\) 反函数)。
但是这个东西好像是和 \(O(\log n)\) 同阶的啊!好像就是 \(O(\frac{n^3}{w\log n})\)?
但后一种好像直接取 \(O(\log n)\) 就很好!直接就是 \(O(\frac{n^3}{w\log n})\)!
但无所谓,反正可以过。