二次离线莫涛
__biu_biu_biu__ · · 算法·理论
前情提要,前置知识:扫描线,莫队。
二次离线莫队
为了方便,我们将
f(l,r,x) 表示点x 对区间[l,r] 的贡献。
对于普通二维莫队,时间复杂度是
所谓的“特定条件”其实就是满足单次修改可以进行拆分,即
- 逆序对。显然点
x 对区间[l,r] 的逆序对贡献为x 对区间[1,r] 的贡献减去区间[1,l-1] 的贡献。 - 求
a_i | a_j 的(i,j) 的个数。这个也是显然的。 - 求
a_i \oplus a_j\le k 的个数。这个也很显然。
对于莫队中的区间推移,假设此时的区间为
- 要更新区间
[l,r+k] ,则答案更新了\sum\limits_{i=r+1}^{r+k}f(1,i-1,i)-f(1,l-1,i) 。 - 要更新区间
[l,r-k] ,则答案更新了-\sum\limits_{i=r-k+1}^{r}f(1,i-1,i)-f(1,l-1,i) 。 - 要更新区间
[l+k,r] ,则答案更新了-\sum\limits_{i=l}^{l+k-1}f(1,r,i)-f(1,i-1,i) 。 - 要更新区间
[l-k,r] ,则答案更新了\sum\limits_{i=l-k}^{l-1}f(1,r,i)-f(1,i-1,i) 。
这就是对于一个询问中莫队要做的事:将
接下来是扫描线部分。
对于每一个点
然后剩下的部分常规扫描线加上一个处理问题的数据结构即可。
但是此时还有一个问题,我们的修改总数量是
总结:莫队二次离线将处理过程中的更改区间通过扫描线变为两部分:修改和查询;然后使用根号平衡等算法将多次查询的复杂度降低,少量修改的复杂度提升,以平衡时间复杂度。
莫队二次离线例题
P4887 【模板】莫队二次离线 / 第十四分块(前体)
考虑莫队。
我们要求
显然此时的修改是可以支持拆分的。我们将所有询问存储下来,一共只有
P5047
使用朴素莫队套树状数组显然超时。考虑优化。
修改可以拆分,考虑二次离线。
在拆分完毕以后,我们现在有
可以使用值域分块代替值域树状数组。
我们记录前
对于修改,可以直接暴力修改块的前缀和,复杂度
总复杂度