@Junlier
2018-09-16T16:12:24.000000Z
字数 1198
阅读 1941
算法——莫队
我学的时候 大米饼的莫队
既然学了这个神奇的东西,那我就来简单地总结一下
首先放一个例题: luogu 小B的询问
其实就是小z的袜子的弱化版。。。虽然网上都拿小z的袜子
作模板讲,但是还得小小推个式子我当时学的时候就比较烦。。。
行吧,这两题的核心部分是一模一样的,你会发现小B的询问
的答案就是小z的袜子
的答案的分子。。。
行吧我们入正题了
我现在说的莫队都只是无修改的莫队啊。。。
不需要觉得这个东西很难,虽然它并不简单。。。
- 维护一个数组表示每个数在当前询问区间的出现次数,表示位置上的数
那么- 所以每次Update的时候可以做到完成
- 减去
- 减少一个
- 加上
不用多说,一切的一切都是为了保证复杂度,所以我们来推一下时间复杂度
- 首先最外层肯定得枚举个询问(已经排好序),我们用指针代表当前询问所在区间
- 看一下的移动复杂度:
- 在同一个块内移动:每个询问最多
- 不在同一个块内移动: 每个询问最多
总的来说就是- 然后是的移动复杂度:
- 对于每一个块,r最多移动n次,我们又有个块
那么复杂度是- n和m的数量级一般差不多,所以整个莫队的复杂度就是滴辣
怎么拓展上面也说了,怎么操作也就这样了,相信你依旧是懵的对不对,那我再总结一下
- 分块 对后面的作用可以往上再看一下
- 排序 对于所有询问我们做了排序,是为了保证我们的答案跟着询问拓展时的复杂度正确
- 地实现拓展 这个上面我应该讲的比较清楚了吧(当然每道题不同)
那么应该还是比较清晰了吧
几道题目练练手
luogu 小B的询问 https://www.luogu.org/problemnew/show/P2709
luogu 小Z的袜子 https://www.luogu.org/problemnew/show/P1494
luogu 异或序列 https://www.luogu.org/problemnew/show/P4462