输入一个长度为 n 的整数序列。
接下来输入 m 个操作,每个操作包含三个整数 l,r,c表示将序列中 [l,r]之间的每个数加上 c。
请你输出进行完所有操作后的序列。
输入格式
第一行包含两个整数 n和 m
第二行包含 n 个整数,表示整数序列。
接下来 m行,每行包含三个整数 l,r,,表示一个操作。
输出格式
共一行,包含 n� 个整数,表示最终序列。
数据范围
1≤n,m≤1000001
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
#include<iostream>
using namespace std;
const int N = 100010;
int b[N], a[N];
void insert(int l, int r, int c)//重点是这里
{
b[l] += c;//1
b[r + 1] -= c;//2
}//问题:这两行是什么意思呢
//答:在第一个insert的调用中这两行是构建差分数组
//因为第一步当i=1,a[1]代入式子1中,可得b1 = a1 + 0写成b1 = a1 - 0吧更好理解
//然后当i=2,a[2]代入,再结合第一步的2式和第二步的1式可得b2 = a2 - a1 ...等等
// b3 = a3 -a2
// ..
// bn = an -a(n -1);
// 这样就推出了差分数组
//问题:为什么还要调用insert呢
//答:因为y总说过这是为了保证差分数组累加后形成的数组的部分区间整体加C
int main()
{
int n, m;
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i ++) scanf("%d", &a[i]);
for(int i = 1; i <= n; i ++) insert(i, i, a[i]);
while(m --)//重复m次操作
{
int l, r, c;
scanf("%d%d%d", &l, &r, &c);
insert(l, r, c);
}
//问题:为什么要循环for要写2次呢
//答:第1个是将差分数组求和得到经历过m次操作的a[]数组的每一个元素
// 第2个是输出差分数组累加完后得的值
for(int i = 1; i <= n; i ++) b[i] += b[i - 1];//写成b[i] = b[i] +b[i-1]更好理解因为加完后再存到b[i]中
for(int i = 1; i <= n; i ++) printf("%d ", b[i]);
return 0;
}
//喜欢就给个关注呗
作者:A_B_C
链接:https://www.acwing.com/activity/content/code/content/7373452/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。