思路
-(中间的某个特定区间增加某一常数)
构造一个b数组,使得a数组每个元素是b数组相应元素的前缀和
-
(差分是前缀和的逆运算)
-
假设有数组b 如果 b[l] + c ,那么 前缀和a[l] 以后的每个元素都增加 c, 如果只想在特定,区间所有元素实现 增加一常数,只需要b[r+1] - c ,使得r之后的每个元素前缀和都减去c即可
-
求原数组值 就是对差分数组求前缀和即可
-
由于假定原数组全是0, 所以现有的a数组元素可以认为是差分得到的
代码
#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;
}
int main()
{
int n, m, cnt = 0;
scanf("%d%d",&n, &m);
for(int i = 1; i <= n; i ++) scanf("%d", &a[i]);
// 由于假定原数组全是0,
//所以现有的a数组元素可以认为是差分得到的
for(int i = 1; i <= n; i ++) insert(i, i, a[i]);
while(m --)
{
int l, r, c;
scanf("%d%d%d", &l, &r, &c);
insert(l, r, c);
}
// 求原数组值 就是对差分数组求前缀和即可
for(int i = 1; i <= n; i ++) b[i] += b[i - 1];
for(int i = 1; i <= n; i ++) printf("%d ",b[i]);
return 0;
}