莫队初探
莫队说:
众所周知,"莫队算法"是用于一类离线区间询问问题的常用算法,以适用性广、代码量短、实际运行速度快、适合骗分 等优点著称,广泛在OI/ACM中被使用和研究。
莫队作为基于暴力的离线算法,降低时间复杂度的主要方法在于,对各询问作出合适的处理。简单说,通过对各讯问进行合理的排序,使得后面的询问可以充分利用之前询问所得到的信息,就可以神奇地将时间复杂度从 降至 。
这样看来的确适合骗分
普通莫队
来道例题:AcWing 2492. HH的项链
最简单的方法当然是来一个询问就对区间[L, R]进行扫描,期望时间复杂度 ,不能再快了
怎么优化呢?我们可以很容易地发现,对于区间,我们可以将它的状态转移至, , 和 。因此,我们可以通过双指针的方法,将区间转移至。我们也可以很容易地发现,时间复杂度还是。并没什么用,但又有点用,因为这是莫队的基础。
再往后,我们可以发现,这种优化的瓶颈在于两个端点的移动次数。只要将右端点升序排序,就可以使右端点最多移动 N 次。这种方式给我们了启发,如果将相邻的左端点也排在一起,复杂度不就降下来了吗?
莫队维护左端点的方法是分块。令每个块的长度为 S,那么总共可以分为 个块。我们将所有区间左端点 L 按所属的块排序,L 相同时再按右端点 R 递增排序。在这样的顺序下,再用上文说过的双指针的暴力做法。此时我们再分析复杂度可以发现:
- 对于左端点指针,在每个块内移动的次数为 S ,移动 M 次;块间移动的次数为 S ,一共移动 次。复杂度为 .
- 对于右端点指针,当左端点在同一块内时,移动 N 次,一共有 个块。复杂度为 .
- 如此一来,整个算法的时间复杂度为 。其中 N 移动小于 ,予以忽略。又由基本不等式 可知, ,当且仅当 时,即 时,有最小复杂度 。
这就是莫队的实现,没错,就像之前说的,莫队是基于暴力的离线算法。
Code
点击查看代码
__EOF__
本文作者:Nebula
本文链接:https://www.cnblogs.com/Nebula-Astraea/p/16215554.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/Nebula-Astraea/p/16215554.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】