差分数组

点击查看代码
// 利用-差分数组-解决问题
// 作用:快速解决“将某一个区间所有元素统一加上一个数”的操作


//1.预处理出来差分数组  f[i]表示:当前元素与前一个元素的差值    f[i] = a[i] - a[i - 1]
//(第二种方式:直接利用性质创建差分数组--可不必创建数组来存储原始数据  f[i] += a[i], f[i+1] -= a[i])


//2.利用差分数组解决 m 次操作 
//性质:原数组[L, R]区间全部加上k这个操作相当于在差分数组中,f[L] += k, f[R + 1] -= k

//3.如何还原出原始的数组?
//直接对差分数组做前缀和运算即可

//注意事项:差分数组使用的时候,所有的操作必须全部进行完毕之后,才能还原出操作之后的数组
//(差分数组的适用范围,是比较局限的)

#include <iostream>

using namespace std;

const int N = 1e5 + 10;
long long a[N];
long long f[N];

int main(){
    int n, m;
    cin >> n >> m;
    for(int i = 1; i <= n; i++){
        cin >> a[i];    //int x; cin >> x;
        f[i] = a[i] - a[i - 1];//也可以性质:f[i] += x; f[i + 1] -= x;
    }
    while(m--){
        long long l, r, k;
        cin >> l >> r >> k;
        f[l] += k;
        f[r + 1] -= k;
    }
    for(int i = 1; i <= n; i++){
        a[i] = a[i - 1] + f[i];  // <=> f[i] = f[i - 1] + f[i];
        cout << a[i] << " ";    //  cout << f[i] << " ";
    }
    return 0;
}
posted @ 2026-03-04 18:51  无酒无剑  阅读(18)  评论(0)    收藏  举报