对于一个数组a定义数组s[i]=\sum_{j=0}^{i}a[j]s[i]=∑j=0ia[j]为a数组的前缀和数组。
//话中是从0加到i,为了避免数组越位,下标从1开始用
for (int i = 1; i <= n; ++i)
{
s[i] = s[i - 1] + a[i];
}
差分数组可以用一个原数组就可以实现,主要式:a[i]-=a[i-1]
//可以正序来写,但需要两个循环,所以可以直接倒着来,比较省时间
for (int i = n; i >= 1; i--)
{
a[i]-=a[i-1];//一个数组即可实现,如果原数组不能改变的话,也可以再用一个数组,d[i]=a[i]-a[i-1]
}
前缀和与差分互为逆运算,一个数组的前缀和数组的差分数组就是它本身,可能不太好理解这句话,就是假如一个数组a,他的前缀和是sum,那么sum的差分数组就是它本身a,绕了一圈,又回来了,这下应该能懂了吧。
进行m次区间修改后的静态单点求值问题
假设需要操作的数组是数组a长度为8,一开始全为0。用数组d来表示差分数组。
下标 | 0 | 1 | 2 | 3 | 4 | 5 |
d | 0 | 0 | 0 | 0 | 0 | 0 |