类似于数学中的求导和积分之间的关系,差分可以看成前缀和的逆运算。
差分数组:
首先给定一个原数组a:a1, a2, a3,,,,,, an;
然后我们构造一个数组b : b1 ,b2 , b3,,,,,, bi;
使得 ai = b1 + b2 + b3 +,,,,,, + bi
也就是说,a数组是b数组的前缀和数组,反过来我们把b数组叫做a数组的差分数组。换句话说,每一个ai都是b数组中从头开始的一段区间和。
注意:始终要记得,a数组是b数组的前缀和数组,比如对b数组的bi的修改,会影响到a数组中从ai及往后的每一个数。
例题:

分析:
首先让差分b数组中的 bl + c ,a数组变成 al + c ,al+1 + c,,,,,, an + c;
然后我们让br+1 - c,所得的数组就只是在l,r区间之内加c
补充:全局变量如果在定义时没有赋初值,编译器会自动赋初值为0
局部变量不可以
cpp
#include<iostream>
#define N 100010
using namespace std;
int arr[N],diff[N];//全局变量
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>arr[i];
diff[i]=arr[i]-arr[i-1];
}
int l,r,c;
for(int i=1;i<=m;i++){
cin>>l>>r>>c;
diff[l]+=c;
diff[r+1]-=c;
}
for(int i=1;i<=n;i++){
arr[i]=diff[i]+arr[i-1];
cout<<arr[i]<<" ";
}
return 0;
}