[AcWing] 差分

差分

题目

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

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

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

输入格式

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

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

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

输出格式

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

数据范围

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

输入样例

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

输出样例

3  4  5  3  4  2

题解

思路

  • a[] 代表原数组,b[] 代表差分数组
  • 序列中 [l, r] 之间的每个数加上 c 相当于将原数组 l 和以后加 c,将 r 之后减 c,也就相当于将差分数组 l 加 c,将 r + 1 减 c
#include <iostream>

using namespace std;

const int N = 1e5 + 20;
int n, m, a[N], b[N];

int main () {
    cin >> n >> m;
    for (int i = 1; i <= n; i ++) cin >> a[i];
    for (int i = 1; i <= n; i ++) b[i] = a[i] - a[i-1];
    
    while (m --) {
        int l, r, c;
        cin >> l >> r >> c;
        b[l] += c, b[r + 1] -= c;
    }
    
    for (int i = 1; i <= n; i ++) b[i] += b[i-1];
    for (int i = 1; i <= n; i ++) cout << b[i] << " "; 
    return 0;
}
发布了83 篇原创文章 · 获赞 1 · 访问量 5908

猜你喜欢

转载自blog.csdn.net/weixin_44922845/article/details/104557110