【树状数组维护区间和】洛谷 P3372 【模板】线段树 1 【树状数组解法】
2021-08-04 16:18:00
# ACM
这里用树状数组写法;
考虑求$[1,x]$的区间和 $sum_x$,于是将原数组差分后,相当于求一个二阶前缀和;
设原数组为 $a_i$, 差分后的数组为 $b_i = a_i - a_{i-1}$;
于是 $a_i = \sum_{j=1}^{i}{b_j}$;
那么[1,x]的区间和为 $sum_x = \sum_{i=1}^{x}a_i = \sum_{i=1}^{x} \sum_{j=1}^{i}b_j$
$sum_x = a_1 + a_2 + \cdots + a_x$
$= (b_1) + (b_1+b_2) + (b_1+b_2+b_3) + \cdots + (b_1+b_2+b_3+\cdots+b_x)$
$= xb_1 + (x-1)b_2 + (x-2)b_3 + \cdots + (x-n+1)b_n + \cdots + b_x $
$= \sum_{n=1}^{x}{(x-n+1)b_n} $
$= (x+1)\sum_{n=1}^{x}b_n - \sum_{n=1}^{x}b_n \cdot n $
于是分别在树状数组上维护 $\sum_{n=1}^{x}b_n $ 与 $ \sum_{n=1}^{x}b_n \cdot n $
$ ans = sum_r - sum_{l-1} $
1 |
|