算法模版
a[N]:前缀和数组
b[N]:差分数组
给前缀和数组a[N]区间[l,r]上都加上c:
b[l] += c,b[r+1] -= c
算法分析
-
求解差分数组
a[0] = 0; b[1] = a[1] - a[0]; b[2] = a[2] - a[1]; ... b[n] = a[n] - a[n-1];
-
区间[l,r]上,对前缀和数组[l,r]的每个数都加上c,可以转变为差分数组
b[l] += c
,则对于前缀和数组i ∈ [l,n],a[i]均加上c;(特别注意:该操作的影响会从l持续到数组的最后一个元素,为此要限定影响) -
为了将影响限定在区间[l,r],需要在b[r+1] -=c,将影响消除。从而不会影响到前缀和数组i∈[l+1,r],a[i]后的每个数都保持原样,不受影响
代码
#include <iostream>
#include <cstring>
using namespace std;
const int N = 100010;
int n,m;
int a[N],b[N];
int main()
{
cin.tie(0);
ios::sync_with_stdio(false);
cin >> n >> m;
for(int i = 1; i <= n; i++) cin >> a[i];
for(int i = 1; i <= n; i++) b[i] = a[i] - a[i - 1];
while(m--)
{
int l,r,c;
cin >> l >> r >> c;
b[l] += c, b[r+1] -= c;
}
for(int i = 1; i <= n; i++)
{
a[i] = a[i-1] + b[i];
cout << a[i] << " ";
}
}