暴力解法(当然ac不了)
#include <iostream>
using namespace std;
int main(){
const int N = 100010;
int n,m,l,r,a[N],c;
cin >> n >> m;
for( int i = 1; i <= n; i ++) cin >> a[i];
while(m --){
cin >> l >> r >> c;
for(int i = l; i <= r; i ++){
a[i] += c;
}
}
for( int i = 1; i <= n ; i ++) printf("%d ", a[i]);
return 0;
}
差分解法
#include <iostream>
using namespace std;
const int N = 100010;
int main(){
int n,m,l,r,c,a[N],b[N];
cin >> n >> m;
a[0] = 0;
b[0] = 0;
b[n+1] = 0;//初始化后面可能用到的数组元素
for(int i = 1; i <= n; i ++ ) {
cin >> a[i];
b[i] = a[i] - a[i-1];
}
while(m--){
cin >> l >> r >> c;
b[l] +=c; //l开始的后续原数组元素均+c
b[r+1] -=c;//r+1开始的后续原数组元素均-c,与上一行代码抵消,故后续无变化
}
for(int i = 1; i <= n; i++) {
b[i] = b[i] + b[i - 1];// 将差分数组转化为原数组
cout << b[i] << ' ';
}
}