树状数组维护区间修改区间查询

对于区间修改单点查询的问题,我们可以通过利用一个差分数组来标记增加的起点与终点,利用树状数组维护其前缀和即可得出每个位置的变化,即:
\[ A_x=a_x+\sum_{i=1}^xb_i \]
那么对于区间修改区间查询则可以通过对区间内每一个点进行如上操作即可,即:
\[ \sum_{i=l}^rA_i=\sum_{i=l}^r\sum_{j=1}^ib_j+\sum_{i=1}^ra_i \]
那么问题则转化为了利用树状数组维护\(\sum_{i=l}^r\sum_{j=1}^ib_j\)

我们可以将此问题简化为求\(\sum_{i=1}^rA_i-\sum_{i=1}^{l-1}A_i\)

那么我们只需求\(\sum_{i=1}^xA_i\)

通过差分的意义,该式可化简为:
\[ \sum_{i=1}^x(x-i+1)\times b_i=(x+1)\sum_{i=1}^xb_i-\sum_{i=1}^xi\times b_i \]
那么维护两个前缀和即可。

猜你喜欢

转载自www.cnblogs.com/MicDZ/p/Binary-Indexed-Trees.html