<—点个赞吧QwQ
宣传一下算法基础课整理{:target=”_blank”}
输入一个长度为 $n$ 的整数序列。
接下来输入 $m$ 个操作,每个操作包含三个整数 $l, r, c$,表示将序列中 $\[l, r\]$ 之间的每个数加上 $c$。
请你输出进行完所有操作后的序列。
输入格式
第一行包含两个整数 $n$ 和 $m$。
第二行包含 $n$ 个整数,表示整数序列。
接下来 $m$ 行,每行包含三个整数 $l,r,c$,表示一个操作。
输出格式
共一行,包含 $n$ 个整数,表示最终序列。
数据范围
$1 \\le n,m \\le 100000$,
$1 \\le l \\le r \\le n$,
$\-1000 \\le c \\le 1000$,
$\-1000 \\le 整数序列中元素的值 \\le 1000$
输入样例:
6 3
1 2 2 1 2 1
1 3 1
3 5 1
1 6 1
输出样例:
3 4 5 3 4 2
思路
差分就是前缀和的逆运算,它是一串数字的前缀和等于某一个数组。
每次把$[l,r]+d$,由于第$l$个数变大了$d$,所以他和前一个数的差就大$d$,所以$a_l+=d$,然后$[l,r]$里的数组的关系不变,但是在$r$开始,第$r+1$个数比第$r$个数少$d$,所以要把$a_{r+1}-=d$
如果还不懂的话,可以看这篇博客
代码
#include <iostream>
using namespace std;
const int N = 100010;
int n,m;
int a[N],b[N];
int main () {
cin >> n >> m;
for (int i = 1;i <= n;i++) {
cin >> a[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++) a[i] = a[i - 1] + b[i];
for (int i = 1;i <= n;i++) cout << a[i] << ' ';
cout << endl;
return 0;
}
这个代码看懂了,y总的插入还没懂hh
hhh
### 感谢分享