Note of 莫队
普通莫队:
-
什么时候能选择莫队:区间答案之前可以相互转化
-
对于莫队块长的选择,\(\sqrt{n}\) 不一定是最优的,有时设为 $\frac{n}{\sqrt{2m} } $ 或 $\frac{n}{\sqrt{m} } $ 可能更优。
-
常数优化:对于排序函数,可以这么写:
inline bool cmp1(node x,node y) {
return (x.lb^y.lb)?x.lb<y.lb:((x.lb&1)?x.r<y.r:x.r>y.r);
// return (belong[a.l] ^ belong[b.l]) ? belong[a.l] < belong[b.l] : ((belong[a.l] & 1) ? a.r < b.r : a.r > b.r);
}
-
当莫队要维护的值不能单纯的通过指针移动维护时,考虑值域分块
-
(普通)莫队分的块大小与排序方式均只会影响时间复杂度,不影响正确性。
树上莫队:
- 将莫队的序列转为 欧拉序列 即可,在不同的题目中用到不同的欧拉序列性质,具体题目具体分析(一般很容易得到结论)。有时需要借助LCA。
带修莫队:
-
将普通莫队改为三维,借此思想还可将莫队改成四维/五维等等。
-
块长设为 \(n^{\frac{2}{3} }\) 时为最优复杂度 \(O(n^{\frac{5}{3} })\)。
回滚莫队:
- 回滚莫队简介:
-
将询问按照正常莫队排序,接下来按块枚举。
-
将我们枚举到的每一个块的莫队左指针初始化为这个块的右端点+1,右指针初始化为这个块的右端点。
-
接下来按顺序进行每一个询问操作。分两种情况:
-
若当前询问的左右端点都在这个块内,则暴力处理。否则进行以下处理:
-
因为询问左端点在当前块的的询问的右端点是升序排序的,所以在处理每一个询问的时候,右指针正常移动处理答案,并记录此时的答案值;左指针在移动之后需要归位并且删除左指针处理过的信息。
- 排序方式对于答案正确性有影响。

浙公网安备 33010602011771号