题目描述:
解题思路:
差分模板题。
题解:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int a[N], diff[N] ;//数组的大小不可能开到大于1e9
int 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;
}