差分与前缀和——一种技巧

前缀和的概念相信很多人都知道.

就是一个数组,要快速静态查询区间和,我们只要处理一个数组时A[i]=a[1]+a[2]+...+a[i].

那么查询区间[l,r]的时候只要输出A[r]-A[l-1].

那么这是时候预处理是O(n)的,查询一次是O(1).

在很多情况下这种算法都是可行的,但是必须满足区间减法的性质.

代码预处理如下:

 
  1. for (int i=1;i<=n;i++)

  2. A[i]=A[i-1]+a[i];

那么差分又是另一种概念.

只不过它可以配套前缀和使用.

差分是一种很巧妙的思想,它的主要用途是维护一个区间的快速修改(加减),但查询是单次的时候.

这种思想的主体就是维护一个数组A,其中A[i]=原数组a[i]-a[i-1].

那么就是刚好与前缀和有点像.

也是互逆的运算.

那么这怎么快速维护呢?

也就是说给区间[l,r]+num.

那么就是给开头A[l]+num,再给结尾A[r+1]-num.

很好理解啊.

那么实现如下:

 
  1. void add(int l,int r,int num){

  2. A[l]+=num;A[r+1]-=num;

  3. }

那么最后需要查询了,就这样处理一下:

 
  1. for (int i=1;i<=n;i++)

  2. a[i]=a[i-1]+A[i];

那么就是原来的数组了.

时间复杂度O(1)修改,O(n)查询.

版权声明:转载请注明原出处啦(虽然应该也没人转载): https://blog.csdn.net/hzk_cpp/article/details/80407014

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值