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})\)

但无所谓,反正可以过。

posted @ 2023-05-25 20:16  PYD1  阅读(477)  评论(0编辑  收藏  举报