前缀和 / 差分
前缀和

基本原理
可以简单理解为求前n项合
- 原数组:\(a_1,\ a_2,\ a_3,\ a_4,\ a_5,\ a_6\)
- 前缀和数组:
\(S[1]\ = a_1\)
\(S[2]\ = a_1\ + a_2\)
\(S[3]\ = a_1\ + a_2\ + a_3\)
\(S[4]\ = a_1\ + a_2\ + a_3\ + a_4\)
\(S[5]\ = a_1\ + a_2\ + a_3\ + a_4\ + a_5\)
...
这个求前缀和的过程称为预处理,时间复杂度为\(O(n)\)
![image]()
问题
如果想求$a_2$ ~ \(a_5\)的和
- 朴素算法
使用for循环
时间复杂度为\(O(n)\)
点击查看代码
for(int i = 2; i < 6; i++){
sum+=a[i];
}
return sum;
- 前缀和
\(S[5]\ - S[1]\)即可
时间复杂度为\(O(1)\)
差分
基本原理
- 差分数组
\(d[1] = a_1 - 0\)
\(d[2] = a_2 - a_1\)
\(d[3] = a_3 - a_2\)
\(d[4] = a_4 - a_3\)
\(d[5] = a_5 - a_4\)
差分数组做一次前缀和会返回成原数组

应用
区间修改(离线),先修改再查询
如果想让[l,r]这个区间 + x
可以d[l]+=x , d[r+1]-=x

浙公网安备 33010602011771号