差分数组
差分数组
传送门:前缀和
在学了前缀和之后如果想要改变前缀和中的数组会变得很麻烦,每次都要拆开来重新求和,那么有没有什么办法来优化这一操作过程呢。
我们就引入了差分数组: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
}

浙公网安备 33010602011771号