O ( n ) \mathcal{O}(n) O(n) 建立一棵树状数组
我们知道,树状数组每个点保存了区间 [ i − low ( i ) + 1 , i ] [i-\texttt{low}(i)+1,i] [i−low(i)+1,i] 的区间和,所以我们可以用前缀和算法求出数组的前缀和 p p p,则树状数组 c c c 第 i i i 个节点的值就是:
p i − p i − low ( i ) p_{i}-p_{i-\texttt{low}(i)} pi−pi−low(i)
O ( n ) \mathcal{O}(n) O(n) 求出前缀和后,就可以再 O ( n ) \mathcal{O}(n) O(n) 建立树状数组了。
树状数组实现区间修改,区间查询
先求出原数组 a a a 的差分数组 d i = a i − a i − 1 d_{i}=a_{i}-a_{i-1} di=ai−ai−1( a 0 = 0 a_{0}=0 a0=0)。
求区间 [ l , r ] [l,r] [l,