前缀和及差分
前缀和与差分是互为逆运算的两种计算方式,前缀和指的是一个数组是另一个数组中前n
项元素之和,而差分指的是一个数组的前n
项的和是另一个数组
实际上就是,如果数组a
是数组b
的前缀和,那b
就是a
的差分
前缀和
根据如上的的解释,我们可以理解为,假设有数组a
为[1, 2, 3, 4, 5]
那么代表它的前缀和数组的数组b
就是1, 3, 6, 10, 15
,也就是说,a[n] = b[1] + b[2] + ... + b[n - 1] + b[n]
,这里我们假设数组是从下标1
开始的,这样我们可以减去一步繁琐的判断
通过前缀和,我们可以快速的求出原数组从l
到r
的区间中元素的和,等于S[l ~ r] = b[r] - b[l - 1]
,有如下代码:
代码
1 |
|
差分
作为前缀和的逆运算,差分可以理解为有算数组a
,它的差分数组b
有如下关系
1 | a[1] = b[1] |
由此可见,如果b
是a
的差分数组,那a
就是b
的前缀和数组,通过差分,我们可以快速的实现对一个区间内的所有元素的同增同减操作
假设我们要让a[2]
到a[6]
的元素全部+1
,我们只需要让b[2] += 1
,b[7] -= 1
即可,代码如下
代码
1 |
|