参考博客
本文总结一下莫队算法这种神奇的分块算法的一些常用技巧。
离线不修改的序列上的莫队
题目情景
在序列上有若干次询问,询问的东西一般可以快速做单点修改或者维护答案。询问时询问区间的答案。
做法
莫队是一种优美的暴力。
首先对所有询问分块,每个块大小,一共块,按照询问的右端点找大块,同一块内部的询问根据左端点排序,在两个询问间转移的时候直接暴力转移更新答案。
复杂度
对于右端点,每一个块里面$R$是乱序的,移动最多是的,所以总共是。
对于左端点,同一个块里面是有序的。最多往回走次,所以复杂度也是的。
小Z的袜子
1 |
|
离线带修改的莫队
题目情景
和之前的莫队不一样,我们现在要求有修改。
做法
同样还是分块之后暴力,这一次,排序的方式是:以为一块,一共将序列分为块。排序第一关键字是左端点所在块编号,第二关键字是右端点所在块编号,第三关键字是时间(其实这个好像无所谓,因为修改和查询是单独存储的,而查询之间互不影响。
每次回答询问时,先从上一个询问的时间“穿越”到当前询问的时间:如果当前询问的时间更靠后,则顺序执行所有修改,直到达到当前询问时间;如果当前询问的时间更靠前,则“时光倒流”,还原所有多余的修改。进行推移时间的操作时,如果涉及到当前区间内的位置的修改,要对答案进行相应的维护。
复杂度
复杂度不太会证明,参考一下上面的博客链接。
2019牛客多校Game
1 |
|
树上莫队
(对不起我还没学会)