解题思路:

  • 分析问题,最直观的办法是暴力,但是在数据量1E5的情况下时间复杂度是达不到要求的。

  • 引入差分数组,降低时间复杂度,对于a1,...,ana_1,...,a_n构造差分数组cf1,...,cfncf_1,...,cf_n对于cfi=aiai1cf_i = a_i - a_{i-1}. alt

  • 对于每一次区间[l,r]修改v,有cfl+=v,cfr+1=vcf_l += v, cf_{r+1} -= v,因为当左边界加上v时,alal1var+1arva_l - a_{l-1}的差值增加了v,而a_{r+1} - a_r应该减小v alt alt 最后只要O(n)O(n)就更新一遍原始数组的值,就得到了答案。

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n, m;
    cin>>n>>m;
    vector<long long> v(n+1,0);
    vector<long long> cf(n+1);
    for(int i = 1; i <= n; ++i){
        scanf("%lld", &v[i]);
        cf[i] = v[i] - v[i-1];
        
    }
    int l, r, a;
    for(int i = 0; i < m; ++i){
        scanf("%d%d%d",&l,&r,&a);
        cf[l] += a;
        if(r+1 <= n) cf[r+1] -= a; 
    }
    for(int i = 1; i < n; ++i){
        v[i] = v[i-1] + cf[i];
        cout<<v[i]<<" "; 
    }
    cout<<v[n-1]+cf[n]<<endl;
    return 0;
}