题目:
对于一个数列,我们定义两种操作:
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]