原题链接:https://www.acwing.com/problem/content/799/
题目分析
一维差分数组的模板题,实现了对(l, r)区间的每一个元素加C
c++代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
int n, m;
int a[N];
int main(){
cin >> n >> m;
//差分数组初始化
int x;
for(int i = 1; i <= n;i++){
cin>>x;
a[i] += x;
a[i + 1] -= x;
}
//操作:区间修改
int l, r, q;
while(m --){
cin >> l >> r >> q;
a[l] += q;
a[r + 1] -= q;
}
//变回原数组 (求前缀和)
for(int i = 1; i <= n;i++){
a[i] += a[i - 1];
}
//输出
for(int i = 1; i <= n;i++){
cout << a[i]<<" ";
}
return 0;
}
代码解释
区间修改
//操作:区间修改
int l, r, q;
while(m --){
cin >> l >> r >> q;
a[l] += q;
a[r + 1] -= q;
}
差分数组创建
就是将区间修改的区间长度设置为1
//差分数组初始化
int x;
for(int i = 1; i <= n;i++){
cin>>x;
a[i] += x;
a[i + 1] -= x;
}
还原为原数组
//变回原数组 (求前缀和)
for(int i = 1; i <= n;i++){
a[i] += a[i - 1];
}
差分和前缀和互为逆运算,所以就是求a的前缀和数组,最后输出就是结果
注意:结果输出,每个数字之间要加空格