2.一维差分 - 蓝桥云课
问题描述
给定一个长度为 n
的序列 a
。
再给定 m
组操作,每次操作给定 3 个正整数 l
, r
, d
,表示对 a_{l}
到 a_{r}
中的所有数增加 d
。
最终输出操作结束后的序列 a
。
Update: 由于评测机过快,n
, m
于 2024-12-09 从 102 加强至 2×105,杜绝暴力通过本题。
输入格式
第一行输入两个正整数 n
, m
。(1≤n,m≤2×105)
第二行输入 n
个正整数 a
。(1≤i≤n,1≤ai≤104)。
接下来 m
行,每行输入 3 个正整数 l
, r
, d
。(1≤l≤r≤n,−104≤d≤104)。
输出格式
输出 n
个整数,表示操作结束后的序列 a
。
样例输入
6 3
1 2 2 1 2 1
1 3 1
3 5 1
1 6 1
样例输出
3 4 5 3 4 2
思路:
模板
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 2e6+10;
int a[N],diff[N];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,m;
cin >> n >> m;
for(int i = 1 ; i <= n ; i++)
{
cin >> a[i];
diff[i] = a[i] - a[i-1];
}
while(m--)
{
int l,r,d;
cin >> l >> r >> d;
diff[l] += d;
if(r + 1 <= n)
diff[r+1] -= d;
}
//复原
for(int i = 1 ; i <= n ; i++)
diff[i] += diff[i-1];
for(int i = 1 ; i <= n ; i++)
cout << diff[i] << " ";
return 0;
}