前缀和 / 差分

前缀和

image

基本原理

可以简单理解为求前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\)的和

  1. 朴素算法
    使用for循环
    时间复杂度为\(O(n)\)
点击查看代码
for(int i = 2; i < 6; i++){
	sum+=a[i];
}
return sum;
  1. 前缀和
    \(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\)

差分数组做一次前缀和会返回成原数组
image

应用

区间修改(离线),先修改再查询

如果想让[l,r]这个区间 + x

可以d[l]+=x , d[r+1]-=x

posted on 2024-01-11 17:22  青san  阅读(9)  评论(0)    收藏  举报