推薦模板題:[USACO19FEB]Painting The Barn
差分與前綴和互為逆運算,即差分數組的前綴和數組為原數組,前綴和數組的差分數組為原數組.二者都利用了容斥原理,這一點在二維平面(或者二維數組)中體現的更加明顯.
那么我們先來講二維前綴和
二維前綴和
一維的前綴和數組是求從數組的首項加到當前項的和,即:
這就是一維前綴和的遞推方法.
那么二維的前綴和,我們定義為以二維數組的首行首列(即左上角)元素為左上角,當前位置元素為右下角的矩陣的元素和.當我們推到\((i,j)\)時,我們考慮該怎么計算\(sum[i][j]\).由於左上角已經固定,我們只考慮右下角.當右下角為\((i,j-1)\)時,這是一個\((i,j)\)左側的矩陣,當右下角為\((i-1,j)\)時,這表示一個\((i,j)\)上方的矩陣.那么如果我們要求\((i,j)\)左上方所有元素的和,是不是只要將這兩個已經計算好的矩陣和加起來,再加上\(a[i][j]\)就行了呢?
當然不是.
因為左側的矩陣和上方的矩陣有一個重合部分,即一個以\((i-1,j-1)\)為右下角的,完全位於\((i,j)\)左上方的矩陣,直接相加時它被計算了兩次,因此我們要把它減去.即:
么這就是二維前綴和,求某個矩陣的和的時候過程與此類似.
二維差分
一維的差分是指每一項比前一項多多少,即:
通過差分數組和樹狀數組可以實現快速的區間加減,也就是使\(cf[l]+v,cf[r+1]-v\)(注意\(r\)要\(+1\)).當我們要求回復正常形式的數組的時候,只需要求前綴和就可以了,即:
那么二維差分呢?它只不過是在一維差分上又加了一維而已.它的遞推公式是這樣的:
即當前元素減去左邊元素再減去上邊元素再加上左上角元素.
那么由二維差分數組要求出原數,只需要求出二維前綴和即可.通過二維差分可以快速實現矩陣加減.