莫队二次离线 学习笔记

djwj233

2021-02-06 21:32:33

Personal

## 莫队二次离线用来做什么 用于优化莫队。 有些时候,莫队区间首尾端点的更新并不是 $\Theta(1)$ 的。 设该复杂度为 $\Theta(k)$,则总复杂度变为 $\Theta(n\sqrt{n}\cdot k)$,不可接受。 这时便需要二次离线进行优化。 ## 主要思想 ### 转化 设 $f([l,r],x)$ 为 $x$ 在 $[l,r]$ 中对答案的贡献。 则每将 $[l,r]$ 扩大至 $[l,r^\prime]$ 的范围,新增的贡献为: $$\sum\limits_{x=r}^{ r^\prime -1} f([l,x],x+1)$$ 注意到 $f([l,x],x+1)=f([1,x],x+1)-f([1,l-1],x+1)$ 则原式等于: $$\sum\limits_{x=r}^{ r^\prime -1} f([1,x],x+1)-\sum\limits_{x=r}^{ r^\prime -1} f([1,l-1],x+1)$$ ### 分别处理 上式中,**前一个和式**的值仅与 $x$ 有关,共 $n$ 种情况。 每次 $\Theta(k)$ 地加入一个点,即可 $\Theta(nk)$ 预处理。 **后一个和式**的话,由于莫队的性质,有: - 所有 $[r,r^\prime-1]$ 的**总长度**是不大于 $\Theta(n\sqrt{n})$ 的。 - 所有 $[r,r^\prime-1]$ 的**总个数**是不大于 $\Theta(n)$ 的。 注意到每次询问的贡献区间是不变的,都是 $[1,l-1]$。 所以把每个 $[r,r^\prime-1]$ 记录在 $l-1$ 的位置,这样空间复杂度是 $\Theta(n)$ 的。 但是怎么计算呢? ### 再次转化 回想我们暴力 $\Theta(n\sqrt{n}\cdot k)$ 的过程,相当于对于每个 $l-1$ 的位置,$\Theta(k)$ 地计算 $[r,r^\prime-1]$ 中所有的值的贡献。 注意到所有 $l-1$ 的个数是 $\Theta(n)$ 的,而所有 $[r,r^\prime-1]$ 的个数是 $\Theta(n\sqrt{n})$ 的。 因此复杂度是 $\Theta(n+n\sqrt{n}\cdot k)$ 的。 怎么优化? 自然是把 $k$ 移过去,即: $$\Theta(n+n\sqrt{n}\cdot {\color{red}k})\ \Rightarrow\ \Theta(n\cdot{\color{red}k}+n\sqrt{n})$$ 换言之,即不采用 $\Theta(1)$ 地扩大 $[1,l-1]$ 的范围,$\Theta(k)$ 地计算所有 $[r,r^\prime-1]$ 的贡献。 而是 $\Theta(k)$ 地在扩大 $[1,l-1]$ 的范围时反着预处理答案,$\Theta(1)$ 计算贡献。 其余三种移动同理,如 $[l,r]$ 扩大至 $[l^\prime,r]$ 即为: $$\sum\limits_{x=l^\prime}^{l-1} f([x+1,r],x)$$ $$=\sum\limits_{x=l^\prime}^{l-1} f([1,r],x)-\sum\limits_{x=l^\prime}^{l-1} f([1,x],x)$$ **时间复杂度 $\Theta(nk+n\sqrt{n})$,空间复杂度 $\Theta(n)$。** ## 例题 ~~正在写~~ - [P4887 【模板】莫队二次离线(第十四分块(前体))](https://www.luogu.com.cn/problem/P4887) - [P5047 [Ynoi2019 模拟赛] Yuno loves sqrt technology II](https://www.luogu.com.cn/problem/P5047)