..

0x03 前缀和与差分

前缀和

对于一个给定的数列 $A$,它的前缀和数列 $S$ 是通过递推能求出的基本信息之一:

\[S[i]=\sum_{j=1}^i{A[j]}\]

一个部分和,即数列 $A$ 某个下标区间内的数的和,可表示为前缀和相减的形式:

\[sum(l,r)=\sum_{i=l}^r{A[i]=S[r]-S[l-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_{l + 1}, \cdots, A_r$ 都加上 $d$),其差分序列 $B$ 的变化为 $B_l$ 加 $d$,$B_{r + 1}$ 减 $d$,其他位置不变。

这有助于我们在很多题目中,把原序列上的 “区间操作”转化为查分序列上的 “单点操作” 进行计算,降低求解难度。

【例题】IncDec Sequence

【例题】Tallest Cow