差分数组

题目:

对于一个数列,我们定义两种操作:
A L R C – 在区间L至R上的所有数加上C
B L R – 输出区间L到R上所有数的和
为了简单起见,数列的初始值全都是0


因为修改和查询是分开的,所以用不到线段树和树状数组。

分析:假设原数组为num[N] 

 d表示num的差分数组 即d[i] = num[i] - num[i-1]
s1 表示d的前缀和 即s1[i] = d[1]+d[2]+...+d[i]
 s2 表示s1的前缀和 即s2[i] = s1[1]+s1[2]+...+s1[i]
另外 num 是d的前缀和,也就是说s1和num表示的是一个数组
 题目说明 num初始全为0,所以d初始也都为0
在区间l至r上的所有数加上c,则d数组中,只有d[l]增加c,d[r+1]减少c
由于修改和查询是分开的
在修改的时候,只要修改d[l]和d[r+1]
 修改结束之后,对d数组的前缀和,得到num数组(也是s1数组)
 然后再对num求前缀和,即s2数组
查询  l到 r 的和,就是s2[r]-s2[l-1]

原文地址:https://www.cnblogs.com/inerbornthisway/p/7905457.html