Acwing-基础算法课笔记之基础算法(差分)
一、一维差分
1、差分的概念
对于一个给定的序列a,它的差分序列b定义为:
b 1 = a 1 b1=a1 b1=a1, b i = a i − a i − 1 bi=ai-ai-1 bi=ai−ai−1, ( 2 ⩽ i ⩽ n ) (2\leqslant i\leqslant n) (2⩽i⩽n)
b是a的差分序列,a是b的前缀和序列,差分与前缀和是一对互逆运算 。
a 1 = b 1 a1=b1 a1=b1,
a 2 = b 2 + a 1 = b 2 + b 1 a2=b2+a1=b2+b1 a2=b2+a1=b2+b1,
a 3 = b 3 + a 2 = b 3 + b 2 + b 1 a3=b3+a2=b3+b2+b1 a3=b3+a2=b3+b2+b1,证毕
2、差分思想
把序列a的区间 l , r l,r l,r加d,等价于其差分序列b的点 b l bl bl加d,点 b r + 1 br+1 br+1减d,其他位置不变。即把原序列的"区间操作 "转化为差分序列的"两点操作 "。多次区间操作完成后,再利用前缀和还原。时间复杂度从 O ( n 2 ) O(n^2) O(n2)降为 O ( n ) O(n) O(n)


二、二维差分
操作流程
| (x1,y1) | * | * | * | * | |||
| * | * | * | * | * | |||
| * | * | * | * | * | |||
| * | * | * | * | (x2,y2) | |||
① b x 1 , y 1 + = c bx1,y1+=c bx1,y1+=c:坐标 ( x 1 , y 1 ) (x1,y1) (x1,y1)右下区域的所有数加 c c c;
② b x 2 + 1 , y 1 − = c bx2+1,y1-=c bx2+1,y1−=c:坐标 ( x 2 + 1 , y 1 ) (x2+1,y1) (x2+1,y1)右下区域的所有数减 c c c;
③ b x 1 , y 2 + 1 − = c bx1,y2+1-=c bx1,y2+1−=c:坐标 ( x 1 , y 2 + 1 ) (x1,y2+1) (x1,y2+1)右下区域的所有数减 c c c;
④ b x 2 , y 2 + = c bx2,y2+=c bx2,y2+=c:坐标 ( x 2 , y 2 ) (x2,y2) (x2,y2)右下区域的所有数多减了 c c c,所以要全部加 c c c。