重拾莫队的一点儿思考

发现在过去一年里好多东西都忘光了,于是全部重来。

对于最简单的一个莫队情景:序列长度为 \(n\),有 \(q\) 次询问,插入、删除复杂度均为 \(O(1)\)

我们把询问按照左端点排序,然后分块,每一块内再按照右端点来排序……等一等?

考虑一下两种不同的分块方式。

第一种,把原序列按 \(B\) 分块,再将询问按照左端点所在块进行分块。

此时每一块内右端点移动次数为 \(O(n)\) 级别,右端点总移动次数为 \(O(\frac{n^2}{B})\) 级别;

左端点的总移动次数是 \(O(qB)\) 级别。

总复杂度 \(O(\frac{n^2}{B}+qB)\),当 \(B\)\(\frac{n}{\sqrt q}\) 时平衡复杂度为 \(O(n\sqrt q)\)

第二种,把询问按 \(B\) 均匀分块。

此时每一块内右端点移动次数仍为 \(O(n)\) 级别,右端点总移动次数为 \(O(n\frac{q}{B})\) 级别;

左端点的总移动次数是 \(O(nB)\) 级别。

总复杂度 \(O(n\frac{q}{B}+nB)\),当 \(B\)\(\sqrt q\) 时平衡复杂度为 \(O(n\sqrt q)\)

也就是说这两种分块方式的最优复杂度都是 \(O(n\sqrt q)\)。有趣的是对于第二种,最优块长与 \(n\) 无关。

不过这些分析也没啥用处,实际做题的时候还是直接硬调吧。

posted @ 2023-08-26 10:37  LFCode  阅读(61)  评论(0编辑  收藏  举报