BIT區間加值

本文最後更新於:2023年6月22日 晚上

緒論

眾所周知,BIT能夠實現在$O(n)$空間下單點加值,並計算區間和。
至於區間加值則需要使用線段樹及lazy tag
但線段樹code超長,debug很累,而且需要約$4n$的空間。

於是我們想要在BIT上實作區間加值,這有可能嗎?

答案是肯定的。

正文

差分

差分就是將序列中的每一項改為自己減去前一項之值,也就是說:

$g_i = f_i - f_{i - 1},if \space i >= 1$
$g_i = g_i,if \space i = 0$

於是乎,當我們要求$f_i$時,只需(?)求出$\displaystyle \sum_{k = 0}^{i} g_k$即可。
看起來畫蛇添足,但這在區間加值,單點查詢時很有用。

差分 + BIT?

BIT能夠在$O(\log n)$時間內完成單點修改區間查詢
而差分則能夠在$O(1)$時間內完成區間加值、$O(n)$時間內完成單點查詢

於是乎,我們將兩者合併。

g[]為差分序列
f[]為原序列

$\displaystyle \sum_{k = 0}^b f_k = \sum_{k = 0}^b g_k \cdot (b + 1 - k) = [(b + 2) \cdot \sum_{k = 0}^b g_i] - [\sum_{k = 0}^b g_i \cdot (k + 1)]$

所以,我們維護兩顆BIT,分別儲存g[]及$g_i \cdot (i + 1)$即可做到$O(\log n)$完成區間加值區間查詢

例題


BIT區間加值
http://mysh212.github.io/2022/12/07/BIT區間加值/
作者
ysh
發布於
2022年12月7日
更新於
2023年6月22日
許可協議