差分
差分应用场景
对区间内频繁地对数组中某个区间进行同一操作。例如将序列中[l, r]之间的每个数加上c这一操作,可能执行n次,每次的c不同,如果对原数组进行操作,每次操作都会花费O(n)的时间复杂度。如果使用该数组的差分数组进行操作,每次操作为O(1)。
然后求差分数组的前缀和即为所求结果。
差分数组
首先给定一个原数组a[]
:a[1], a[2], a[3], … , a[n];
然后我们构造一个数组b[]
: b[1] ,b[2] , b[3], … , b[i];
使得 a[i] = b[1] + b[2 ]+ b[3] +,..., + b[i]
也就是说,a
数组是b
数组的前缀和数组,反过来我们把b
数组叫做a
数组的差分数组。换句话说,每一个a[i]
都是b
数组中从头开始的一段区间和。
考虑如何构造差分b
数组?
最为直接的方法
a[0]= 0;
b[1] = a[1] - a[0];
b[2] = a[2] - a[1];
b[3] = a [3] - a[2];
........
b[n] = a[n] - a[n-1];
差分数组的使用?
给定区间[l ,r ]
,让我们把a
数组中的[ l, r]
区间中的每一个数都加上c
。
由于a
数组是b
数组的前缀和
,所以有这样的一个性质:
抽象的来说:
797. 差分
输入一个长度为 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
输入样例:
1 |
|
输出样例:
1 |
|
代码实现
1 |
|