重拾莫队的一点儿思考

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

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

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

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

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

此时每一块内右端点移动次数为 O(n) 级别,右端点总移动次数为 O(n2B) 级别;

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

总复杂度 O(n2B+qB),当 Bnq 时平衡复杂度为 O(nq)

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

此时每一块内右端点移动次数仍为 O(n) 级别,右端点总移动次数为 O(nqB) 级别;

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

总复杂度 O(nqB+nB),当 Bq 时平衡复杂度为 O(nq)

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

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

posted @   LFCode  阅读(67)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 三行代码完成国际化适配,妙~啊~
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
点击右上角即可分享
微信分享提示
主题色彩