二維差分與二維前綴和


推薦模板題:[USACO19FEB]Painting The Barn

差分與前綴和互為逆運算,即差分數組的前綴和數組為原數組,前綴和數組的差分數組為原數組.二者都利用了容斥原理,這一點在二維平面(或者二維數組)中體現的更加明顯.

那么我們先來講二維前綴和

二維前綴和

一維的前綴和數組是求從數組的首項加到當前項的和,即:

\[sum[i]=\sum_{j=1}^{i}a[j]=(\sum_{j=1}^{i-1}a[j])+a[i]=sum[i-1]+a[i] \]

這就是一維前綴和的遞推方法.
那么二維的前綴和,我們定義為以二維數組的首行首列(即左上角)元素為左上角,當前位置元素為右下角的矩陣的元素和.當我們推到\((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)\)左上方的矩陣,直接相加時它被計算了兩次,因此我們要把它減去.即:

\[sum[i][j]=\sum_{p=1}^{i}\sum_{q=1}^{j}a[i][j]=\sum_{p=1}^{i}\sum_{q=1}^{j-1}a[p][q]+\sum_{p=1}^{i-1}\sum_{q=1}^{j}a[p][q]-\sum_{p=1}^{i-1}\sum_{q=1}^{j-1}a[p][q] + a[i][j]=sum[i][j-1]+sum[i-1][j]-sum[i-1][j-1]+a[i][j] \]

么這就是二維前綴和,求某個矩陣的和的時候過程與此類似.

二維差分

一維的差分是指每一項比前一項多多少,即:

\[cf[i]=a[i]-a[i-1] \]

通過差分數組和樹狀數組可以實現快速的區間加減,也就是使\(cf[l]+v,cf[r+1]-v\)(注意\(r\)\(+1\)).當我們要求回復正常形式的數組的時候,只需要求前綴和就可以了,即:

\[a[i]=cf\_sum[i-1]+cf[i] \]

那么二維差分呢?它只不過是在一維差分上又加了一維而已.它的遞推公式是這樣的:

\[cf[i][j] = a[i][j]-a[i][j-1]-a[i-1][j]+a[i-1][j-1] \]

即當前元素減去左邊元素再減去上邊元素再加上左上角元素.

那么由二維差分數組要求出原數,只需要求出二維前綴和即可.通過二維差分可以快速實現矩陣加減.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM