什么是差分数组:
比如:有一个数组 a1 , a2 , a3 ,a4 ,a5…
如果存在另一个数组b ,使得 a1 = b1 , a2 = b1 + b2 …
意思是 a数组的每一项都为b数组的前缀和,则称b数组是a数组的差分数组
作用:快速让数列中的某一段加上一个数
思路:
如果在区间【L , R】每一个数加c,则只需要在它的差分数组中 b[L] + C , b[R+1] - C
再求和差分数组即可得到所求数组
题目
输入一个长度为 n 的整数序列。
接下来输入 m 个操作,每个操作包含三个整数 l,r,c,表示将序列中 [l,r] 之间的每个数加上 c。
请你输出进行完所有操作后的序列。
输入格式
第一行包含两个整数 n 和 m。
第二行包含 n 个整数,表示整数序列。
接下来 m 行,每行包含三个整数 l,r,c,表示一个操作。
输出格式
共一行,包含 n 个整数,表示最终序列。
数据范围
1≤n,m≤100000,
1≤l≤r≤n,
−1000≤c≤1000,
−1000≤整数序列中元素的值≤1000
输入样例:
6 3
1 2 2 1 2 1
1 3 1
3 5 1
1 6 1
输出样例:
3 4 5 3 4 2
代码
#include <iostream>
using namespace std;
const int N = 100010;
int a[N] , b[N];
void insert(int l , int r , int c){
b[l] += c;
b[r + 1] -= c;
}
int main(){
int n , m;
cin >> n >> m;
for(int i = 1 ; i <= n ; i ++ )
cin >> a[i];
//构造差分数组
for(int i = 1 ; i <= n ; i ++ )
insert(i , i , a[i]);
/*
这个也可以哦
for (int i = 1; i <= n; i++)
{
b[i] = a[i] - a[i - 1]; 构建差分数组
}
*/
while(m--){
int l , r , c;
cin >> l >> r >> c;
insert(l , r , c);
}
// 让差分数组成为a数组
for(int i = 1 ; i <= n ; i ++ )
b[i] += b[i - 1];
for(int i = 1 ; i <= n ; i ++ )
cout << b[i] << " ";
return 0;
}