根号分块

根号分块

根号分块用于维护 区间信息。每次操作的复杂度为 $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]]}$。

posted @ 2025-07-11 23:38  fyv233  阅读(8)  评论(0)    收藏  举报