AcWing 797. 差分
原题链接
简单
作者:
每一刻都是崭新的
,
2021-03-31 19:48:27
,
所有人可见
,
阅读 356
#include <iostream>
using namespace std;
const int N = 1e5+10;
int a[N],b[N];
void insert(int l,int r,int c)
{
b[l] += c;
b[r+1] -= c;
}
/*
初始化操作 数据的下标在 1~n
b[1]+=a[1] b[2]-=a[1]
b[2]+=a[2] b[3]-=a[2]
b[3]+=a[3] b[4]-=a[3]
b[n-1]+=a[n-1] b[n]-=a[n-1]
b[n]+=a[n] b[n+1]-=a[n]
b[1] = a[1]
b[2] = a[2]-a[1]
b[3] = a[3]-a[2]
b[n-1] = a[n-1]-a[n-2];
b[n] = a[n]-a[n-1];
b[n+1] = -a[n]
即:b[i] = a[i]-a[i-1]达到同样效果(a[0] = 0)
由此可知差分数组是原数组每两项的差
逆向思维:(a数组和b数组进行交换),前缀和数组是原数组前n项的和,可以认为这两种运算是互逆的!
前n项等式左右相加使得:差分数组满足: Sbn = b[1] + b[2] + ... + b[i] = a[i]
*/
int main(void)
{
int n,m;
cin >> n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) insert(i,i,a[i]); //初始化拆分 或者b[i] = a[i]-a[i-1];
//操作(拆分后操作比直接操作复杂度低)
while(m--){
int l,r,c;
cin>>l>>r>>c;
insert(l,r,c);
}
//合并
for(int i=1;i<=n;i++) a[i] = a[i-1]+b[i];
for(int i=1;i<=n;i++) cout<<a[i]<<" ";
return 0;
}