1.3 前缀与差分

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] (2\leq 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,其他位置不变,这有助于我们很多题目中,把原序列上的“区间操作”转化为差分序列上的“单点操作”进行计算,降低求解难度。

3. 相关练习

1.激光炸弹

2.IncDec Sequence

3.Tallest Cow

posted @ 2019-10-10 16:49  楓羽  阅读(159)  评论(0编辑  收藏  举报