差分数组

差分数组

传送门:前缀和


​ 在学了前缀和之后如果想要改变前缀和中的数组会变得很麻烦,每次都要拆开来重新求和,那么有没有什么办法来优化这一操作过程呢。

我们就引入了差分数组:b[i]=a[i]-a[i-1],即代表:现在这个数字与前一个数字的差值.

可以看到这个表格:

位置 0 1 2 3 4 5 6
a(原数组) 4 2 3 4 6 7 10
b(差分数组) 0 -2 -1 -1 2 1 3

那么当我们想要修改某一个区间的时候:

比如区间[2,4]的数字都要加2

那么b[2]+=2,b[4+1]-=2

代表:第【1】个位置的数字和第【2】个位置的数字的改变了(变大或变小),且第【2】个到第【4】个数字之间的差不发生改变,那么相当于第【2】到【4】个数字增大了,因为他们之间的差没变。

位置 0 1 2 3 4 5 6
a(原数组) 4 2 3 4 6 7 10
b(差分数组) 0 -2 1 -1 2 -1 3

代码实现(伪):

for(int i=1;i<=n;i++)
{
    b[i]=a[i]-a[i-1];//求差分
}
b[2]+=2,b[4]-=2;
//如果有多次修改,那么就用循环。
for(int i=1;i<=n;i++){
    sum[i]=sum[i-1]+b[i-1];//合并,若是用不到前缀和就直接改变数组a
}
posted @ 2021-03-15 15:22  RuanCat  阅读(119)  评论(0)    收藏  举报