莫队
普通莫队
莫队通过将所有询问按某种顺序排序,并暴力地增、删元素来在询问间转移。
莫队的适用条件是,信息不能高效地合并,但可以高效地加入、删除。具体地,若加入、删除一个元素的复杂度都为
复杂度分析
我们将序列分成大小约为
常数优化
对于左端点在奇数块的询问,将其按照右端点从小到大排序;左端点在偶数块的询问,右端点从大到小排序。
[AHOI2013] 作业
给定整数序列
, 次查询区间 内值在 中的不同数的个数。
。
如果对序列维做莫队,用树状数组维护每种数是否出现,这是
值域分块,它需要支持
总复杂度
[Ynoi2016] 这是我自己的发明
给定一棵有根树,每个点有颜色
,开始时根是 。有 次操作,每次是以下两种之一:
- 给定
,将根更改为 ; - 给定
,询问有多少个二元组 满足 在 的子树内, 在 的子树内,且 。
我们以
- 根在
的某个儿子的子树内; - 根是点
; - 根不在点
的子树内。
所以每个询问都可以拆成
坑点:应该将点的颜色映射在 dfn 上。
代码:https://github.com/YOYO-UIAT/oi-code/blob/main/luogu/P4689.cpp。
JOISC 2014 历史研究
给定整数序列
,定义 为 在 中的出现次数, 次询问,每次给定区间 ,求 。
。
不用回滚莫队。可以发现答案只有
代码:https://github.com/YOYO-UIAT/oi-code/blob/main/luogu/AT1219.cpp。
[Ynoi2015] 盼君勿忘
给定整数序列
, 次询问,每次给定区间 和模数 ,求区间中所有子序列去重后的和 。
。
设询问的区间长度为
P3604 美好的每一天
给定一个由小写字母组成的字符串
, 次询问某个区间内有多少子区间可以重排成一个回文串。
,3s。
首先,一个字符串
高维莫队
我不会证的结论:对于
是最优的,时间复杂度是
二次离线莫队
对于一些问题,普通莫队的做法是维护一个变量表示当前的答案,然后用数据结构维护一些信息来更新这个答案,这会在数据结构上产生
P5047 [Ynoi2019 模拟赛] Yuno loves sqrt technology II
给定整数序列
, 次查询一个区间的逆序对个数。
,250ms,32MB。
设
左移: ; 右移: ; 右移或 左移:同理。
显然
对于第一种,树状数组与处理即可;对于第二种,将所有这样的询问做扫描线,用
这样时间复杂度可以做到
代码:https://github.com/YOYO-UIAT/oi-code/blob/main/luogu/P5047.cpp。
树上括号序莫队
用于处理查询树上一段链的信息,可以做到与普通莫队相同的时间复杂度。
将树映射到括号序上,每个点在括号序中恰好出现两次,位置设为
- 若
,则用莫队计算括号序中在 中恰好出现过一次的点的信息; - 否则,计算
中恰好出现过一次的点的信息,并将 的信息额外加上。
带修莫队
加一维时间维,和三维莫队本质相同。假如有
WC2013 糖果公园
给定一棵
个点的树, 次操作,每次是单点修改或者查询一段链上的简单莫队信息。
,6s。
直接用树上带修莫队做就行了。注意若修改的次数是
代码:https://github.com/YOYO-UIAT/oi-code/blob/main/luogu/P4074.cpp。
回滚莫队
假如只能支持快速加入或者删除,并且支持快速撤销,仍然可以做到
P5906 不删除莫队
给定整数数列
,多次询问某个区间 内的 ,若不存在则输出 。
。
将序列分成
- 若当前左端点与上次的左端点不在同一个块内,撤销所有操作,并将莫队的指针放在当前块的右端点;
- 若左端点与右端点在同一个块内,暴力求解,转
; - 移动莫队的右指针;
- 移动莫队的左指针,然后计算答案;
- 撤销
中的操作。
可以理解为,对于每一个块,左端点在这个块内的询问,右端点是单调递增的,所以在右端点处只会加不会删;对于左端点,它移动的距离每次不超过块大小,所以每次计算完暴力撤销复杂度就是对的。
代码:https://github.com/YOYO-UIAT/oi-code/blob/main/luogu/P5906.cpp。
不添加莫队:P4137 Rmq Problem / mex
多次询问某个区间的
。
。
与不删除莫队相似,我们先将询问排序,但这次对于右端点要降序排序。对于每一个询问:
- 若当前左端点与上次的左端点不在同一个块内,撤销直到莫队的右指针到达
,然后删除直到莫队的左指针到达当前块的左端点; - 不需要暴力求解;
- 移动莫队的右指针;
- 移动莫队的左指针,然后计算答案;
- 撤销
中的操作。
代码:https://github.com/YOYO-UIAT/oi-code/blob/main/luogu/P4137.cpp。
PS:这题有非常简单的
作者:alan-zhao-2007
出处:https://www.cnblogs.com/alan-zhao-2007/p/mo-algorithm.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具