本文均认为询问与序列长度同阶。
莫队因为指针移动的次数达到 (O(n sqrt n)) 级别,因此要求指针移动修改答案的复杂度是 (O(1)) 的。
如果一些问题不能做到很快速的修改,但是贡献具有可减性,就可尝试再次离线处理。
形式化的说就是设 (f(x,l,r)) 表示 ([l,r]) 对 (x) 的贡献,它可以被 (f(x,1,r)) 与 (f(x,1,l-1)) 求出。
这样问题就被转化为一个前缀对某个位置的贡献,如果能用不劣于 (O(sqrt n) - O(1)) 的数据结构维护,就能解决上面的问题了。
注意两点:
-
不需要记录每一次指针的挪动,这样空间开销很大,是 (O(n sqrt n)) 级别的。只需记录每一种的挪动(就四种嘛)。
因为这些挪动都是“固定某个端点,另一个端点位移一个区间”,只需记移动的两端,到时候再暴力扫。 -
第二次离线后,求出来的是指针位移引发的变化量,即差分数组,要做一遍前缀和。