ConstStar
发布于 2022-12-25 / 114 阅读 / 0 评论 / 0 点赞

算法题:差分

问题描述

输入一个长度为 n 的整数序列。

接下来输入 m 个操作,每个操作包含三个整数l,r,c,表示将序列中 [l,r]之间的每个数加上 c。

请你输出进行完所有操作后的序列。

输入格式

第一行包含两个整数 n 和 m。

第二行包含 n 个整数,表示整数序列。

接下来 m 行,每行包含三个整数 l,r,c,表示一个操作。

输出格式

共一行,包含 n 个整数,表示最终序列。

样例

输入

6 3
1 2 2 1 2 1
1 3 1
3 5 1
1 6 1

输出

3 4 5 3 4 2

数据范围

1≤n,m≤100000
1≤l≤r≤n
−1000≤c≤1000
−1000≤整数序列中元素的值≤1000

解决方案

思路

差分

代码

#include <iostream>

using namespace std;

int main() {
    int n, m;
    cin >> n >> m;

    int arr[n];
    for (int i = 0; i < n; ++i) {
        cin >> arr[i];
    }

    //差分
    int b[n];
    b[0] = arr[0];
    for (int i = 1; i < n; ++i) {
        b[i] = arr[i] - arr[i - 1];
    }

    // [l,r]之间的每个数加上 c
    for (int i = 0; i < m; ++i) {
        int l, r, c;
        cin >> l >> r >> c;
        b[l - 1] += c;
        if (r < n)
            b[r] -= c;
    }

    //输出
    int t = 0;
    for (int i = 0; i < n; ++i) {
        t += b[i];
        cout << t << " ";
    }
    return 0;
}

评论