分析:
差分可以看作是前缀和的逆运算。
前缀和可以帮我们快速的处理某种操作,例如给定一个
[
L
,
R
]
[L,R]
[L,R] 区间,让我们在
a
a
a 数组的该区间内全都加上某个数
C
C
C,暴力遍历
a
a
a 数组的化需要
O
(
n
)
O(n)
O(n),我们可以改为对差分数组
b
b
b 进行操作,使降为
O
(
1
)
O(1)
O(1)。
一个关键的思想是:假定 a a a 数组初始全为 0 0 0。可以看成是进行了 n n n 次插入操作。对于差分数组而言相当于分别在 [ 1 , 1 ] [1,1] [1,1] 这个区间插入 a 1 a1 a1, [ 2 , 2 ] [2,2] [2,2] 这个区间插入 a 2 a2 a2,…, [ n , n ] [n,n] [n,n] 这个区间插入 a n an an。
当循环进行完 b [ i ] + = b [ i − 1 ] b[i] += b[i - 1] b[i]+=b[i−1] 后, b b b 数组就是按照要求处理后的 a a a 数组。
代码(C++)
#include <iostream>
using namespace std;
const int N = 100010;
int a[N], b[N];
int n, m;
void insert(int l, int r, int c)
{
b[l] += c;
b[r + 1] -= c;
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i ++)
{
scanf("%d", &a[i]);
insert(i, i, a[i]);
}
while (m --)
{
int l, r, c;
cin >> l >> r >> c;
insert(l, r, c);
}
// b 求和后,就是操作后的 a 数组
for (int i = 1; i <= n; i ++)
{
b[i] += b[i - 1];
printf("%d ", b[i]);
}
}