一. 题目

image.png

二. 理论

image.png

三. 代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int N=1e5+10;

int n, m;

class Difference
{
public:
    int a[N], b[N];//原数组,原数组的差分数组
public:
    Difference()
    {
        initIO();
        fill(a, a+N, 0);
        fill(b, b+N, 0);
    }

    void initIO()
    {
        // 关闭输入输出缓存,使效率提升
        ios::sync_with_stdio(false);
        // 解除cin和cout的默认绑定,来降低IO的负担使效率提升
        cin.tie(nullptr);
        cout.tie(nullptr);
    }

    //求出差分数组b
    void initD()
    {
        for(int i=1;i<=n;++i)
            b[i]=a[i]-a[i-1];
    }

    //给a数组l~r间每个数都加x
    void add(int l, int r, int x)
    {
        b[l]+=x;
        b[r+1]-=x;
    }

    //多个区间加完后,对b求前缀和,得到新a
    void getPa()
    {
        for(int i=1;i<=n;++i)
            b[i]+=b[i-1];
    }
}d;

int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;++i)
        cin>>d.a[i];
    d.initD();

    while(m--)
    {
        int l, r, x;
        cin>>l>>r>>x;
        d.add(l, r, x);
    }
    d.getPa();
    for(int i=1;i<=n;++i)
        cout<<d.b[i]<<" ";
}