差分定义
差分是前缀和的逆序算。
原数组:a[1],a[2],a[3],a[4],a[5]
差分数组:a[1],a[2]-a[1],a[3]-a[2],a[4]-a[3],a[5]-a[4]
注意:原数组是差分数组的前缀和数组。
差分的作用
可以快速的对数组的某一个区间每个数加上一个常数。
用法
- 先求出原数组a的差分数组b
- 区间[l,r]中每个数加c执行的操作:b[l]+=c;b[r+1]-c;
例题
题目
给一个长度为n数组。
有m组操作,每个操作是在区间[l,r]中每个数加c。
最后输出操作后的数组。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int s[N];
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>s[i];
for(int i=n;i>=1;i--) s[i]-=s[i-1];//求差分数组
while(m--)
{
int l,r,c;
cin>>l>>r>>c;
s[l]+=c;
s[r+1]-=c;
}
for(int i=1;i<=n;i++)//对差分数组求前缀和得到原数组
{
s[i]+=s[i-1];
cout<<s[i]<<" ";
}
cout<<endl;
return 0;
}