根号分块
根号分块
根号分块用于维护 区间信息。每次操作的复杂度为 $O(\sqrt{n})$ ,预处理的复杂度为 $O(n)$。
预处理
我们把 $a$ 分成 $\sqrt{n}$ 块,那么,第 $i$ 块的区间 $[L_i, R_i]$ 就为 $[(i-1)\sqrt{n}-1, i\sqrt{n}]$ 。
有时会剩下一些数不被任何块包含,我们应当再建一个块。
我们定义 $blk_i$ 表示 $a_i$ 属于第 $i$ 个块。
区间修改 Usual
假设,我们要修改 $[l, r]$ 这段区间,我们应当把不是完整分块的数单独修改,并维护区间总和。
然后对于被 $[l, r]$ 完全包含的区间,在他的块上加上所有节点对总和的贡献 。
区间查询 Usual
假设,我们要查询 $[l, r]$ 这段区间,我们应当把不是完整分块的数单独相加。
然后对于被 $[l, r]$ 完全包含的区间,在加上当前块的总和即可 。
Unusually
有时,我们无法直接计算贡献。我们可以要修改的区间挂一个 Tag。表示该区间的所有数都要修改。
查询时,我们需一个一个计算,公式为 $sum = sum + a_i + \text{Tag[blk[a[i]]}$。