莫队二次离线
众所周知:
莫队是一个神仙的算法,它的复杂度为:$O(n \sqrt{m} f(n))$。其中 $f(n)$ 为左右端点移动一格的复杂度。
但是这并不能满足我们,我们发现当 $f(n)$ 过大时就无法接受了。
这是就要引入神仙的数据结构:莫队二次离线,它可以将该复杂度优化至:$O(nf(n)+n\sqrt{m})$。
设:一个元素 $x$ 对一个区间 $[l,r]$ 的贡献为:$f(x,[l,r])$
一个元素 x 对一个区间 $[1,k]$ 的贡献为:$f(x,k)$
当一个元素 $x$ 对一个区间 $[l,r]$ 的贡献满足:$f(x,[l,r])=f(x,r)-f(x,l-1)$
我们就可以进行莫队二次离线。
设 $h(l,r)$ 为一段区间的答案,$g([l_1,r_1],[l_2,r_2])$ 为区间 $l_1$~$r_1$ 对 $l_2$~$r_2$ 的贡献。
当我们要跳转 $h(l_1,r_1)$ 到 $h(l_2,r_2)$ :
先考虑 $h(l_1,r_1)$ 到 $h(l_2,r_1)$ :
当$l_1 \rightarrow l_1+1$:
有左端点向右移的贡献:
$$-f(l_1,[l_1,r_1])=-f(l_1,r_1)+f(l_1,l_1-1)$$
等式右边的$f(l_1,l_1-1)$这东西可以预处理。
时间复杂度很容易分析:$O(nf(n))$
主要是考虑等式右边的$f(l_1,r_1)$
考虑将柿子完全写出来:
$$\sum_{x=l_1}^{l_2-1}-f(x,r_1)+f(x,x-1)$$
主要求:
$$\sum_{x=l_1}^{l_2-1}-f(x,r_1)$$
我们可以记下关键词 $l,r,id,p,i$,分别代表求和符号的上界和下界,在第几次问题中改动,正负,右边的不动点。
此处,$l=l_1,r=l_2-1,p=-1,i=r_1$
当$l_1 \rightarrow l_1-1$:
有左端点向左移的贡献:
$$f(l_1-1,[l_1-1,r_1])=f(l_1-1,r_1)-f(l_1-1,l_1-2)$$
等式右边的$f(l_1-1,l_1-2)$这东西可以预处理。
时间复杂度很容易分析:$O(nf(n))$
主要是考虑等式右边的$f(l_1-1,r_1)$
将柿子完全写出来:
$$\sum_{x=l_2}^{l_1-1}f(x,r_1)-f(x,x-1)$$
主要求:
$$\sum_{x=l_2}^{l_1-1}f(x,r_1)$$
此处,$l=l_2,r=l_1-1,p=1,i=r_1$
再考虑 $h(l_2,r_1)$ 到 $h(l_2,r_2)$ :
当$r_1 \rightarrow r_1-1$:
有右端点向左移的贡献:
$$-f(r_1,[l_1,r_1])=-f(r_1,r_1)+f(r_1,l_1-1)$$
等式右边的$f(r_1,r_1)$这东西可以预处理。
时间复杂度很容易分析:$O(nf(n))$
主要是考虑等式右边的$f(r_1,l_1-1)$
将柿子写出来:
$$\sum_{x=r_2+1}^{r_1}-f(x,x)+f(x,l_1-1)$$
主要求:
$$\sum_{x=r_2+1}^{r_1}f(x,l_1-1)$$
此处,$l=r_2+1,r=r_1,p=1,i=l_1-1$
当$r_1 \rightarrow r_1+1$:
有右端点向右移的贡献:
$$f(r_1+1,[l_1,r_1+1])=-f(r_1+1,r_1+1)+f(r_1+1,l_1-1)$$
等式右边的$f(r_1+1,r_1+1)$这东西可以预处理。
时间复杂度很容易分析:$O(nf(n))$
主要是考虑等式右边的$f(r_1+1,l_1-1)$
将柿子写出来:
$$\sum_{x=r_1+1}^{r_2}f(x,x)-f(x,l_1-1)$$
主要求:
$$\sum_{x=r_1+1}^{r_2}-f(x,l_1-1)$$
此处,$l=r_1+1,r=r_2,p=-1,i=l_1-1$
然后扫描线就可以将我们存的这些量修改即可。
复杂度变成了:$O(nf(n)+n\sqrt{m})$
以下给出模板题:
https://www.luogu.com.cn/problem/P4887
https://www.luogu.com.cn/paste/rs7cp0o5
以及练手题:
https://www.luogu.com.cn/problem/P5398
https://www.luogu.com.cn/paste/kg48scuw