前缀和和差分

  • 假设给定一个数组 A ,其差分数组为 B, 如果对A数组的某个区间 [l, r]上每个数都加一个数c, 其等价于 B 数组中 B[l] += c,且 B[r + 1] -=c。因为A[l]表示B[l]的前缀和,则如果B[l]多加一个c(B[l] += c),则A[l], A[l+1], …, A[r], A[r + 1], …, A[n] 都将多加一个c。而我们只需要 [l, r] 上加c,所以对于 A 在 [r+1, n]区间上的值再减去 c,即对应于 B[r + 1] -= c。

  • 在初始化时,我们可以理解为在0数组上,依次插入一个c = A[i],则只需要对差分数组执行 B[i] += A[i], B[i + 1] -= A[i]即可

  • 最终所有m个操作后,得到的是对差分数组B的操作,分别求其各个位置的前缀和即得到A数组

前缀和就是s[i]=s[i-1]+a[i] 差分就是 b[i]=a[i]-a[i-1]

  • for循环求a的差分数组b就可以看成初始时数组全是0,是空的,然后在[1,1]的区间上插入a[i],每个位置上得到的效果就是

b[i]=a[i]-a[i-1]从而求得了差分数组

  • 而l,r,c中的insert才是真正为了解题的,b是a的差分数组,a是b的前缀和数组,所以如果要在a数组的值在[l,r]上都加c,那么就只需要在差分数字里面b[l]上加上c,得到的效果就是a中区间[l,r]都加了c。最后在r+1的位置上打一个补丁b[r+1]-=c就可以了。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值