前缀和差分
一维前缀和
主要的作用是可以快速的求出数组中任意一段区间的和
- 核心代码
S[i] = a[1] + a[2] + ... a[i]//S是前缀和数组,下边从1开始,方便边界的计算
a[l] + ... + a[r] = S[r] - S[l - 1]
二维前缀和
类似于一维前缀和,主要是为了快速求出二维数组中人任意上下对角构成的区域数字之和
- 核心代码
S[i, j] = 第i行j列格子左上部分所有元素的和
以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵的和为:
S[x2, y2] - S[x1 - 1, y2] - S[x2, y1 - 1] + S[x1 - 1, y1 - 1]
一维差分
主要是快速给一个区间中的所有的数加上一个数
- 核心代码
给区间[l, r]中的每个数加上c:B[l] += c, B[r + 1] -= c
二维差分
同上述一维差分类似(一维变二维)
- 核心代码
给以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵中的所有元素加上c:
S[x1, y1] += c, S[x2 + 1, y1] -= c, S[x1, y2 + 1] -= c, S[x2 + 1, y2 + 1] += c