神奇的莫队
Part -1: 参考资料
参考资料1
万分感谢这个大佬,祝他报送清华北大!
本文同步发表于知乎
Part 0: 一些介绍
莫队由莫涛神仙首次提出,是一种区间操作算法。
即便是板子题,难度也很高(差评)
所以,在阅读后文之前,请你先深呼吸,喝杯咖啡,吃点饼干,听听自己喜欢的歌
然后,停止呼吸,放下杯子,扔开饼干,摘下耳机,接受莫涛大神思想光辉的洗礼
Part 1:莫队算法的引入
先别谈莫队,我们来回顾一下,遇到区间问题一般怎么解决?
很好,暴力线段树
也就是说,我们一直在通过维护两个序列——左序列与右序列,从而来维护,当然,这个操作会一直递归下去
然而,当题目这么问:
令数组大小为且每个元素,有个询问,每次询问给定,请找出中至少重复出现此的数字的个数
换句话说:
在到内找出现次数多余的数字的个数
of course,你可以暴力,但你会暴零
那么我们试着用线段树,首先,你需要维护左边的序列,然后你需要维护右边的序列,然后……
然后你会发现很难做到短时间甚至的时间完成对线段树单一节点的维护,因为你总是要层层递进向上叠加。
淦!这不是欺负人吗
我们先试试暴力吧,用个记录一下出现次数,然后在扫一遍
暴力是万能的,答案当然正确,但是你的时间复杂度哭了——
那么我们可以看看是否可以改进一下,用上算法:
假设有两个指针,和,每次询问的时候用移动和的方式来尝试和要求区间重合
是不是有点蒙?我举个栗子
此图中,两个Q是待求的区间
初始化
此时,发现和要求的区间左端重合了,而没有,那么我们把往右边移动一位
此时,发现了一个新的值,总数记录一下,继续右移动
又发现了一个新数值,总数记录一下,继续右移动
此处被记录过了,总数值不变
一直到与右端点重合,得到下图:
第一个区间就算处理完了,我们来看下一个
首先,不在左端点,我们把它右移
这一次,所遇到的数值在区间只能够存在,总数不变
下一次也是如此,一直到
你会发现,这时,区间将(也就是在下一次移动后)不会有存在了,那么总数就一个,而正好本题需要统计的就是区间内数值的个数,总数改变:
如此循环往复,得到最终答案,所以我们可以得出这个代码
嗯,干得漂亮,但是这是莫队吗?不是
如果区间特别多,反复横跳,结果皮断了腿,时间复杂度
那么现在的问题已经变成了:如何尽量减少移动的次数?
Part 2:莫队的正确打开方式
首先,看到尽量减少移动的次数,我们会想到排个序
排序排什么的顺序呢?是排端点吗?显然不是,哪怕左端点有序,右端点就会杂乱无章;右端点有序,左端点就会杂乱无章……
这里,我们运用一下分块的思想,把序列分为块,把查询区间按照左端点所在块的序号排个序,如果左端点所在块相同,再按右端点排序。
这个算法需要的时间复杂度为
由于的时间复杂度为,的时间复杂度为,那么总的时间复杂度为
好耶!降了一个根号!鼓掌!
其次,我们需要考虑一下更新的策略
一般来说,我们只要找到指针移动一位以后,统计数据与当前数据的差值,找出规律(可以用数学方法或打表),然后每次移动时用这个规律更新就行
最后给出总代码:
Part 3:关于莫队的一些卡常数
卡常数作为OIer的家常便饭,相信大家一定不陌生了
卡常数包括:
- 位运算
O2- 快读
- ……
而莫队的神奇之处在于他的独特优化:奇偶性排序
原代码:
改为
别人说跑的很快我还不信,自己跑了一下才知道……
真的跑的很快啊……
Part 4: 能修改的莫队
我知道,你拿着上面别个大佬写的代码(再次膜拜写这个代码的大佬orz)兴冲冲的去刷题,一路上披荆斩棘,直到你看到了Luogu1903——国家集训队-数颜色,你彻底傻了眼
妈耶,他要是这么一修改我岂不是要重新sort?跑了跑了
由于莫队本身就是离线的,而你需要修改,得想个办法让他在线,具体做法是:“就是再弄一指针,在修改操作上跳来跳去,如果当前修改多了就改回来,改少了就改过去,直到次数恰当为止。”
(再次感谢这个大佬,,好喜欢这个解释)
__EOF__

本文链接:https://www.cnblogs.com/sdltf/p/13698417.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具