差分:用O(1)的时间代替O(n)对一个序列的一个区间进行处理。
经原序列可以得到的差分序列,差分序列求前缀和可以得到原序列。
把对原序列进行的操作转化成对差分序列进行操作。
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int arr[N],brr[N];
int n,m;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>arr[i];
}
for(int i=1;i<=n;i++){//求差分序列
brr[i]=arr[i]-arr[i-1];
}
for(int i=1;i<=m;i++){//对差分序列进行处理
int l,r,c;
cin>>l>>r>>c;
brr[r+1]=brr[r+1]-c;
brr[l]=brr[l]+c;
}
for(int i=1;i<=n;i++){//转换回来(求原序列)
arr[i]=arr[i-1]+brr[i];
}
for(int i=1;i<=n;i++){
cout<<arr[i]<<" ";
}
return 0;
}