算法思路
现给出差分定义:
原有数组a[1],a[2],a[3]…a[n]
构造数组b[1],b[2],b[3]…b[n]
使的a[i] = b[1] + b[2] …+b[n]即a[n]数组为b[n]数组的前缀和
换句话说使b[i] = a[i] - a[i-1] 即可
此时在区间[l,r]上加c的操作即可转移到b[n]数组进行。
具体操作为在b[l] + c,在b[r+1] - c即可
#include <iostream>
using namespace std;
int n,m;
const int N = 100010;
int a[N],b[N];
int main()
{
scanf("%d%d",&n,&m);
a[0] = 0;
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++)
{
a[i] = a[i-1] + b[i];
printf("%d ",a[i]);
}
return 0;
}