一维差分
作者:
巷港
,
2022-02-15 18:02:39
,
所有人可见
,
阅读 153
一维差分
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 1e5+10;
int a[N],b[N]; //a数组表示原数组,b数组表示差分数组(即a数组是b数组的前缀和数组)
int m,n;
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i]-a[i-1]; //因为a是b的前缀和数组,即a[i]=a[i-1]+b[i],所以b[i]=a[i]-a[i-1]
}
while (m--) //m次操作
{
int l,r,c;
scanf("%d%d%d",&l,&r,&c); //每次操作读入左区间、右区间和常数c
b[l]+=c;
//此操作的效果:a[l]~a[n]每个数字都加上了c,因为a[l]~a[n]每个数字中都包含b[l];
b[r+1]-=c;
//此操作的效果是:a[l+1]~a[n]的每个数都减去c,因为a[l+1]~a[n]每个数都包含b[l+1],
//但由于上一步b[l]+c这个操作已经使得a[l+1]~a[n]加了c,现在又减去了c,因此,现在a[l+1]~a[n]保持不变
}
for (int i=1;i<=n;i++)
{
a[i]=a[i-1]+b[i]; //求b的前缀和数组a
printf("%d ",a[i]);
}
return 0;
}