一、前缀和
1.1 定义
前缀和是一个数组的某项下标之前(包括此项元素)的所有数组元素的和。
1.2 性质
- 静态区间求和。
//a 为原数组,b 为前缀和数组
for (int i=1;i<=n;i++)
{
cin >> a[i];
b[i] = b[i-1] + a[i];
}
二、差分
2.1 定义
数列中一个数和它前面的那个数之差。
2.2 性质
- 性质1:将原序列区间[L,R]中的元素全部 + k,可以转化操作为差分序列L处 + k,R+1处 - k。
//原序列区间 + k 操作转化为差分序列操作 L 处 +k,在R + 1 处 -k
for(int i = 0;i<m;i++)
{
cin >> l >> r;
a[l] += k;
a[r+1] -= k;
}
- 性质2:差分序列求前缀和可得原序列。