U 群常见根号题汇总

· · 算法·理论

如果有一些细节不懂或还有一些其他的题,可以在下面评论或私信我。

1. 区间加,区间 kth

我不会,见 zak 博客。

2. 区间加,区间乘积

类似末日三问,考虑以 B 为块长进行分块。

每个块开一棵线段树,每个节点维护这个区间 (a_i+x) 乘积的多项式,pushup 就把两个儿子的多项式卷起来。

散块暴力,对于相邻两次块重构间的所有询问,我们做一个多点求值,这部分是 O(\dfrac{nm\log^2 n}B) 的。

散块修改就在块内线段树做区间修改,递归到的终止节点做一次多项式平移,然后打一个区间加的 \text{tag},这部分是 O(mB\log n) 的。

总时间复杂度 O(\dfrac{nm\log^2 n}B+mB\log n)B\sqrt{n\log n} 即可做到 O(m\sqrt n\log^{1.5} n)

3. \bmod x=y 的位置加,求和

考虑以 B 为块长进行操作序列分块,散块对散块只需做一个 exgcd,这部分是 O(mB\log n) 的。

整块对散块可以转为下面这两个子问题:

4. \bmod x=y 的位置加,求最终序列

L 为阈值进行根号分治,对 x>L 的暴力,这部分是 O(\dfrac{nm}L) 的。

对于 x\le L 的,一次操作相当于加 \dfrac{kz^y}{1-z^x},于是可以转为求 \sum\limits_{k=1}^L\dfrac{f_k}{1-z^k}

分治卷积做一下就是 O(L^2\log^2 n+n\log n)

总时间复杂度 O(\dfrac{nm}L+L^2\log^2 n+n\log n)L\dfrac{\sqrt[3]{nm}}{\log^{\frac 23} n} 即可做到 O((nm\log n)^{\frac 23})

5. 给定初始序列,\bmod x=y 的位置求和

直接把上一问的做法转置即可,时间复杂度 O((nm\log n)^{\frac 23})

然后考虑原问题,直接套上两问时间复杂度即 O(mB\log n+\dfrac{nm}L+\dfrac{L^2m\log^2 n}B+\dfrac{nm\log n}B)