我也不知道为什么我不会的大多是基础算法…
定义
对于一维来说,前缀和与差分的处理较为简单。
前缀和,即是某一数列中,第i号元素及其之前的全部元素之和。对于某数列A,其前缀和S的信息
差分。即第i项与i-1项之差。给定一个数列A,它的差分数列B为
由此可以看出,前缀和和差分是一对互逆运算。
差分序列B的前缀和序列就是原序列A
前缀和序列S的差分序列就是原序列A
上面的性质非常之重要,稍后会在二维中用到。
应用
前缀和可以快速的帮助我们求得某一个区间的和。
即对于原序列A中的一个区间(l,r),有前缀和序列S
差分可以快速的帮助我们进行区间同时加、减操作。
对于原序列A的区间(l,r)加d 其差分序列就变化为
Bl+d ,Br+1-d
其他位置均不需要改变。如果需要实装到原序列上,只需要将差分序列做一个前缀和即可。
二维
这里引用一个例题来讲解会显得比较自然
激光炸弹 BZOJ1218
我们以S[i,j]代表二维前缀和。那么我们接下来观察一下
S[i,j],S[i-1,j],S[i,j-1],S[i-1,j-1]
这样我们就可以得到这样的递推式