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。

例题:SP10707CF375D


带修莫队:

  • 将普通莫队改为三维,借此思想还可将莫队改成四维/五维等等。

  • 块长设为 \(n^{\frac{2}{3} }\) 时为最优复杂度 \(O(n^{\frac{5}{3} })\)


回滚莫队:

  • 回滚莫队简介:
  1. 将询问按照正常莫队排序,接下来按块枚举。

  2. 将我们枚举到的每一个块的莫队左指针初始化为这个块的右端点+1,右指针初始化为这个块的右端点。

  3. 接下来按顺序进行每一个询问操作。分两种情况:

  4. 若当前询问的左右端点都在这个块内,则暴力处理。否则进行以下处理:

  5. 因为询问左端点在当前块的的询问的右端点是升序排序的,所以在处理每一个询问的时候,右指针正常移动处理答案,并记录此时的答案值;左指针在移动之后需要归位并且删除左指针处理过的信息。

  • 排序方式对于答案正确性有影响。
posted @ 2023-06-06 18:18  Pwtking  阅读(17)  评论(0)    收藏  举报