暴力解法(当然ac不了)

  1. #include <iostream>
  2. using namespace std;
  3. int main(){
  4. const int N = 100010;
  5. int n,m,l,r,a[N],c;
  6. cin >> n >> m;
  7. for( int i = 1; i <= n; i ++) cin >> a[i];
  8. while(m --){
  9. cin >> l >> r >> c;
  10. for(int i = l; i <= r; i ++){
  11. a[i] += c;
  12. }
  13. }
  14. for( int i = 1; i <= n ; i ++) printf("%d ", a[i]);
  15. return 0;
  16. }

差分解法

#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] << ' ';
    }
}