莫队能处理的东西
- 离线的区间问题
- 易对答案进行撤销或增加操作
莫队是什么
- 莫队就是通过排序和分块所优化的暴力,为根号算法(数据结构???)
算法思路
- 一道例题(入门):
给定一个序列,求[l,r]有多少个不同的正整数
- 考虑将序列分块,块大小为Sqrt(n),将操作区间的左端点所在块为第一关键字排序,右端点为第二关键字排序。
- 每一个块中有若干个左端点,右端点为升序排列。
- 设两个指针i,j分别表示当前答案所表示区间的左端点和右端点,指针j单调递增,指针i暴力在块内左右扫,维护答案。
- 直到[i,j]按顺序完全和所问区间吻合,并记录答案。
- 时间复杂度:i在块内对于每一个l最多跳sqrt(n),共l次,故sqrt(n)*n次,跨越块的类似。j对于每一个块都左往右扫了一遍序列,共sqrt(n)*n。所以总复杂度为O(sqrt(n)*n)
- 思路简单,代码简短。
带修莫队
- 多了一维时间戳,有修改操作依旧暴力去改。将l,r所在块为第一第二关键字排序,将时间戳t单调递增。跟上面的暴力做法完全一样,下面是时间复杂度证明
(From:https://www.cnblogs.com/ouuan/p/MoDuiTutorial.html)
树上莫队
- 将树上的子树查询或路径查询通过DFS序或欧拉序转化为区间问题。
- 再通过朴素的莫队解决即可
随便说说
- 其实我并没有打过莫队,因为只能用莫队做的题目着实不多,经常用其他的算法代替。
- 但思想上学习一下还是可以的。
- 希望以后可以碰到一些莫队的题目。
例题
- JZOJ3360苹果树(树上莫队)
我学习的blog
https://www.cnblogs.com/WAMonster/p/10118934.html
https://www.cnblogs.com/ouuan/p/MoDuiTutorial.html