题目
https://www.acwing.com/problem/content/799/
算法思想
差分是前缀和的逆运算,对于 a1, a2, ..., an,构造 b1, b2, ..., bn,使得 ai = b1 + b2 + ... + bi 。
b1 = a1
b2 = a2 - a1
b3 = a3 - a2
bn = an - an-1
即 b 数组称为 a 数组的差分,a 称为 b 数组的前缀和。如果有 b 数组,可以用 O(n) 的时间得到 a。
通过差分可以用 O(1) 的时间复杂度达到对 a 数组在 [l, r] 区间内的每个数字 +c,即 bl + c,br+1 - c。
如何将 a 转为 b?
假定 a 数组初始全为 0,对应差分数组 b 也全为 0,对 ai 赋值操作,可以看成是在 [i, i] 区间内 + ai ,即 bi + ai,bi+1 - ai。
题解
#include <iostream>
using namespace std;
const int N = 100010;
int arr[N];
void insert(int i, int j, int num)
{
arr[i] += num;
arr[j+1] -= num;
}
int main()
{
int n, m, tmp;
std::cin >> n >> m;
for(int i = 1; i <= n; ++i)
{
std::cin >> tmp;
insert(i, i, tmp);
}
int l, r, c;
while(m--)
{
std::cin >> l >> r >> c;
insert(l, r, c);
}
for(int i = 1; i <= n; ++i)
{
arr[i] += arr[i-1];
std::cout << arr[i] << " ";
}
return 0;
}
复杂度
时间复杂度:O(n),空间复杂度:O(1)