一維差分與二維差分

2022-09-10 21:27:33 字數 2203 閱讀 3246

**自

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,如下所示:

1 2 4 3

5 1 2 4

6 3 5 9

那麼對應的二維差分矩陣 b 如下:

1  1  2 -1

4 -5 -1 3

1 1 1 2

和一維差分的用途基本一致,在乙個二維矩陣中,有多塊區間需要增加或減少乙個數值,多次操作後求最終的矩陣內容。如果按照傳統辦法,就是二層迴圈,複雜度很高,如果預處理出乙個二維的差分矩陣,以後的多輪操作都轉為了4次加加減減操作,可以視為o(1)級別的時間複雜度,運算效率將得到極大提高。

如果我們要在左上角是(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,...