1. 前缀和
1. 一维数组前缀和
对于一个给定的序列A,它的前缀和数列S是通过递推能够求出的基本信息之一:
$S[i] = sum_{x=1}^i A[x]$
一个部分和,即数列A某个下标区间内的数的和,可表示为前缀和相减的形式:
$sum(l,r) = sum_{x=l}^r A[x] = S[r] - S[l-1]$
2. 二维数组前缀和
类似的我们可以表示出二位前缀和
$sum(1, 1, i, j)$
$= sum_{x=1}^i sum_{y=1}^j A[x][y]$
$= sum_{x=1}^{i-1} sum_{y = 1}^{j} A[x][y] + sum_{x=1}^{i} sum_{y = 1}^{j-1} A[x][y] - sum_{x=1}^{i-1} sum_{y = 1}^{j-1} A[x][y] + A[i][j]$
$= sum(1, 1, i-1, j) + sum(1, 1, i, j-1) - sum(1, 1, i-1, j-1) + A[i][j]$
一个部分和,几数列二维数列A某个区间的和(x1, y1, x2, y2),可以表示为前缀和相减的形式:
$sum(x1, y1, x2, y2)$
$= sum_{x=x1}^{x2} sum_{y=y1}^{y2} A[x][y]$
$= sum_{x=1}^{x2} + sum_{y=1}^{y2} A[x][y] - sum_{x=1}^{x2} + sum_{y=1}^{y1-1} A[x][y] - sum_{x=1}^{x1-1} sum_{y=1}^{y2} A[x][y] + sum_{x=1}^{x1-1} sum_{y=1}^{y1-1} A[x][y]$
$= sum(1, 1, x2, y2) - sum(1,1, x2, y1-1) - sum(1,1, x1-1, y2) + sum(1,1, x1-1, y1-1) $
2. 差分
1. 一维差分
对于一个给定的数列A,它的差分数列B定义为:
$B[1]=A[1], B[i] = A[i]-A[i-1] (2leq i leq n)$
容易发现前缀和和差分是一对互逆运算,差分序列B的前缀和序列就是原序列A,前缀和序列S的差分序列就是A。
把序列A的区间[l, r]加d(即把$A_l, A_{i+1}, A_{i+2},...,A_r$都加上d),其差分序列B的变化为$B_l$加上d,$B_{r+1}$减去d,其他位置不变,这有助于我们很多题目中,把原序列上的“区间操作”转化为差分序列上的“单点操作”进行计算,降低求解难度。