差分 和 前缀和 互为逆运算。
有数列 a[1,2,3....n]
构造数列 b[1,2,3....n]
使得 a[i]=b[1]+b[2]+....+b[i] 那么b称为a的差分,a称为b的前缀和
可以在O(1)的时间复杂度内解决对数组a的一段区间的所有数加上c 的操作
只需b[l]+c,b[r+1]-c
再对b数组求前缀和就的到了操作后的a数组。
C++ 代码
#include<iostream>
using namespace std;
const int N=1e5+10;
int n,m;
int a[N];
int b[N];//差分数组
int s[N];//修改之后的a数组
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
//构造差分数组
for(int i=1;i<=n;i++)b[i]=a[i]-a[i-1];
while(m--){
int l,r,c;
scanf("%d%d%d",&l,&r,&c);
b[l]+=c;b[r+1]-=c;//插入操作
}
/*for(int i=1;i<=n;i++)s[i]=s[i-1]+b[i];
for(int i=1;i<=n;i++)
printf("%d ",s[i]);*/
for(int i=1;i<=n;i++)b[i]+=b[i-1];//前缀和
for(int i=1;i<=n;i++)
printf("%d ",b[i]);
return 0;
}