**自leetcode周賽第四題需要用到二維差分,所以就找了篇文章,便於檢視b[
i]=a
[i]−
a[i−
1],稱b陣列是a陣列的差分陣列。
舉個栗子:a=
[0,1
,2,3
,4,5
]b=[
0,1,
1,1,
1,1]
為啥呢?a[
5]−a
[4]=
b[5]
a[4]
−a[3
]=b[
4]a[
3]−a
[2]=
b[3]
a[2]
−a[1
]=b[
2]a[
1]−a
[0]=
b[1]
a陣列是b陣列的一維字首和陣列
在某個區間[l,r]的多次操作都加上(或減去)乙個數x時,一維差分可以大大提高運算速度。
舉個栗子:
總結公式:
void insert(int l,int r,int c)
我們利用剛才的結論:通過「疊加」差分陣列,就可以還原出「原陣列」的每乙個數字!!這玩意就整一回合適嗎?不合適,還不夠費功夫的呢!生成一維差分也就算了,從一維差分陣列還原回原陣列就需要n次運算,整不好還賠了呢!但如果是多次區間加減運算,就合適了!
我們有乙個矩陣,如下圖所示。
根據二維字首和表示的是左上角矩形的和,由於差分只涉及前面相鄰的數(由一維可以推出),並且由前面範圍的數相加得到這個位置的數。那麼模擬二維字首和和一維差分,可以簡單推測出
二維差分的公式b[
i][j
]=a[
i][j
]−a[
i−1]
[j]−
a[i]
[j−1
]+a[
i−1]
[j−1
]如何從差分矩陣得到原矩陣呢?[就是二維字首和公式]a[
i][j
]=a[
i−1]
[j]+
a[i]
[j−1
]−a[
i−1]
[j−1
]+b[
i][j
]舉個栗子
比如,我們有乙個矩陣 a,如下所示:
那麼對應的二維差分矩陣 b 如下:1 2 4 3
5 1 2 4
6 3 5 9
和一維差分的用途基本一致,在乙個二維矩陣中,有多塊區間需要增加或減少乙個數值,多次操作後求最終的矩陣內容。如果按照傳統辦法,就是二層迴圈,複雜度很高,如果預處理出乙個二維的差分矩陣,以後的多輪操作都轉為了4次加加減減操作,可以視為o(1)級別的時間複雜度,運算效率將得到極大提高。1 1 2 -1
4 -5 -1 3
1 1 1 2
如果我們要在左上角是(x1,y1)
,右下角是(x2,y2)
的矩形區間每個值都+c
,如下圖所示
在我們要的區間開始位置(x1,y1)
處+c
,根據字首和的性質,那麼它影響的就是整個黃色部分,多影響了兩個藍色部分,所以在兩個藍色部分-c
消除+c
的影響,而兩個藍色部分重疊的綠色部分多了個-c
的影響,所以綠色部分+c
消除影響。所以對應的計算方法如下:
void insert(int x1, int y1, int x2, int y2, int c)
差分矩陣 二維差分
輸入乙個n行m列的整數矩陣,再輸入q個操作,每個操作包含五個整數x1,y1,x2,y2,c,其中 x1,y1 和 x2,y2 表示乙個子矩陣的左上角座標和右下角座標。每個操作都要將選中的子矩陣中的每個元素的值加上c。請你將進行完所有操作後的矩陣輸出。輸入格式 第一行包含整數n,m,q。接下來n行,每...
差分 (2)二維差分
前面部分我們介紹了一維差分,下面我們擴充套件一下,來介紹二維差分。我們有乙個矩陣,如下圖所示。根據二維字首和表示的是右上角矩形的和,由於差分只涉及前面相鄰的數 由一維可以推出 並且由前面範圍的數相加得到這個位置的數。那麼模擬二維字首和和一維差分,可以簡單推測出二維差分的公式 如何從差分矩陣得到原矩陣...
AcWing 差分矩陣 二維差分
時 空限制 1s 64mb 輸入乙個n行m列的整數矩陣,再輸入q個操作,每個操作包含五個整數x1,y1,x2,y2,c,其中 x1,y1 和 x2,y2 表示乙個子矩陣的左上角座標和右下角座標。每個操作都要將選中的子矩陣中的每個元素的值加上c。請你將進行完所有操作後的矩陣輸出。第一行包含整數n,m,...