题目描述:
解题思路:
差分模板题。
题解:
#include<bits/stdc++.h>
using namespace std;const int N = 1e5 + 10;
int a[N], diff[N] ;//数组的大小不可能开到大于1e9int res(int n, int m)
{for(int i = 1; i <= n; i++)cin >> a[i];for(int i = 1; i <= n; i++)diff[i] = a[i] - a[i-1];//建立初始差分数组while(m--)//典型的差分操作:对diff操作改变一段区间{int x, y, z; cin >> x >> y >> z;diff[x] += z; diff[y + 1] -= z; }/* while内不能这样写,既不标准同时也会超时O(n^2)while(m--){for(int i = 1; i <= n; i++){diff[i] = a[i] - a[i-1];}int x, y, z; cin >> x >> y >> z;diff[x] += z;diff[y + 1] -= z;for(int i = 1; i <= n; i++){a[i] = a[i-1] + diff[i];} }*/for(int i = 1; i <= n; i++)a[i] = a[i-1] + diff[i];//差分数组的前缀和数组即该差分数组的原数组,令a数组为前缀和数组覆盖原数组以达到修改原数组的目的for(int i = 1; i <= n; i++)cout << a[i] << " \n"[i == n];//[i == n]:符合条件使用"\n"。一定要写,不然不符合题目输出要求(不论是输入一个还是输入一组都不 符合);return 0;//注意:返回值一定要正确,不然会影响调试结果
}int main()
{int n, m; while(cin >> n >> m)res(n, m);//while(cin >> n >> m):程序会一直执行return 0;
}