莫队小记

莫队

考虑一个经典的问题。对一个数列进行 \(m\) 次区间求和。暴力需要 \(O(nm)\),但是莫队可以优化到 \(O(n\sqrt m)\)

思想具有启发式思维。假如我们知道 \([l,r]\) 的和为 \(k\)。在此基础上 \([l-1,r],[l,r+1]\) 都可以很快得到。莫队是对上一个问题解决这个问题。要给对问题的求解一个顺序,否则 \(l,r\) 的移动在最坏情况都是 \(n\)。用分块的思想排序,设块长为 \(len\)。把 \(l\) 的块编号按第一关键字,\(r\) 为第二关键字排序。这样,\(l\) 移动次数为 \(len\times m\)\(r\) 移动次数为 \(\frac{n^2}{len}\)。均值不等式求得 \(len = \sqrt \frac{n^2}{m}\)在莫队中,块长对于复杂度有决定性的作用

总之记住一句话:莫队只是改变了询问的顺序,让暴力跑的更快。

小优化

  1. 对于块编号 \(id\),使用数组存储。
  2. 对于奇数块,\(r\) 升序;偶数块,\(r\) 降序。

回滚莫队

很多时候我们只方便在加(减)的时候统计答案。以下考虑只加不减。

回观普通莫队,对于每次询问。\(l\) 都可能减。但是只要还在一个块。\(r\) 只会增加。

我们需要在每次询问时,将 \(l\) 只加不减。修改为当前块的右端点 \(+1\)。在当前块变化时,将 \(r\) 修改为当前块的右端点。

然后按照普通莫队求解,但是这时候 \(l\) 的操作是临时的,不要覆盖可以重复使用的区间答案。按照普通莫队的分析方法可证复杂度 \(O(n\sqrt m)\)

例题 JOISC 2014 Day1 历史研究.

树上莫队

一般都是将树的括号序跑下来。在这上面做莫队。例题:COT2 - Count on a tree II

带修莫队

其实就是增加了一维时间。

二次离线莫队

posted @ 2024-04-29 14:19  cjrqwq  阅读(11)  评论(0)    收藏  举报