题目

https://www.acwing.com/problem/content/799/

1-jxrf.webp

算法思想

差分是前缀和的逆运算,对于 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)