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;
}