差分与前缀和
前缀和:
- 一维前缀和:
设 一维数组
A
,有N
个元素,prev_sumA
为前缀和数组
for(int i = 1; i <= n; i++)
prev_sumA[i] += prev_sumA[i-1] + A[i];
在数组A中求 L—R之和
ans = prev_sumA[R] - prev_sumA[L-1]
- 二维前缀和:
设 二组
B
,有N*M
个元素,prev_sumB
为前缀和数组
for(int i = 1; i <= N; i++)
for(int j = 1; j <= M; j++)
prev_sumB[i][j] += prev_sumB[i][j-1] + prev_sumB[i-1][j] - prev_sumB[i-1][j-1];
求以(x,y)为右下顶点,边长为R的正方形,(矩形也可类似变通)
ans = prev_sumB[y][x] - prev_sumB[y][x-R] - prev_sumB[y-R][x] + prev_sumB[y-R][x-R];
后缀和就是反过来
差分
- 差分是前缀合的逆运算
设 一维数组
A
,有N
个元素, 将A数组转换为差分数组数组A
for(int i = N ; i > 1 ; --i)
A[i] -= A[i-1];
//A[1] 没有变
- 通过对差分数组进行前缀和操作可以得到原数组
for(int i = 1 ; i < N ; ++i)
A[i+1] += A[i]
- 常见操作 :对区间[L,R]加上一个常数K
// A 已是差分数组
A[L] += K;
A[R+1] -= K;
//再用前缀和就可以使原数组[L,R]加上一个常数K
推荐练习题: