本笔记内容来源于算法基础课
差分
对于给定的数组a1,a2,…,an
则差分数组为b1,b2,…,bn, 其中ai=b1+b2+…+bi
b为a的差分,a为b的前缀和
bi的作用
对于数组中的任意区间[l, r]
, 都进行操作+C
al+C,al+1+C,…,ar+C
若bl+C, 则al之后的项都会+C, 因为它们的前缀和都会包括项bl,即作用于区间[l,+∞)
同时还需要保证br+1之后的项不会+C, 因此br+1−C
因此两种方法比较:
- 遍历区间数组,时间复杂为O(n)
- 操作差分数组,bl+C,br+1−C,时间复杂度为O(1)
注意:
最后要求数组b的前缀和,来重新得到a
边界问题
构造bi
实际上并不需要构造
考虑a数组初始全为0,进行n次插入操作,对区间[i,i]操作+ai
二维差分
对于原矩阵aij,则差分矩阵bij,使得aij=∑x=1∼i,y=1∼ jbxy
同样先不需要考虑如何构造,而只需要考虑如何更新
二维矩阵中任意个子矩阵以(x1,y1) (x2,y2)为对角线进行操作+C
而差分数组操作bij+C,作用于子矩阵[(i,j),(+∞,+∞)]
因此进行如下操作:
bx1y1+C,bx1y2+1−C,bx2+1y1−C,bx2+1y2+1+C
构造差分则进行n∗m次插入操作,对[(xiyj),(xiyj)]执行操作+C
最后求b的二维前缀和即可得到a
例题
Acwing 4195 只维护差分的端点