【复习笔记】莫队
简介
莫队可以用来批量处理区间问题,是 一种高效的暴力。
实现
将区间 \([1,n]\) 分为长度为 \(B\) 的若干块,将 左端点 排序,对于同一块内的询问,再按 右端点 排序。
复杂度证明:
左端点 在 同一区间 内一次最多移动 \(B\),最多移动 \(q\) 次,时间复杂度 \(O(qB)\),
每个点最多被两个 跨块 询问覆盖,时间复杂度 \(O(n)\)。
右端点,每个块 \(O(n)\)(按升序排序之后),共 \(n \over B\) 个块,总共 \(O(\frac{n^2}{B})\)。
总时间复杂度 \(O(qB+\frac{n^2}{B})\),平衡一下 \(B\) 取 \(\frac{n}{\sqrt q}\) 时最优。
小优化:奇数块右端点按 升序 排列,偶数块按 降序 排列(减少右端点跨块之间的移动)。