差分 (2)二維差分

2021-10-03 05:49:55 字數 2600 閱讀 2802

前面部分我們介紹了一維差分,下面我們擴充套件一下,來介紹二維差分。

我們有乙個矩陣,如下圖所示。

根據二維字首和表示的是右上角矩形的和,由於差分只涉及前面相鄰的數(由一維可以推出),並且由前面範圍的數相加得到這個位置的數。那麼模擬二維字首和和一維差分,可以簡單推測出二維差分的公式

如何從差分矩陣得到原矩陣呢?可以參考下面公式

p.s. 道歉,前面這個公式寫錯了,感謝 @繁星-落眼 的糾正。再次道歉。

比如,我們有乙個矩陣 a,如下所示:

1 2 4 3

5 1 2 4

6 3 5 9

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

1  1  2 -1

4 -5 -1 3

1 1 1 2

如果我們要在左上角是 (x1,y1),右下角是 (x2,y2) 的矩形區間每個值都 +a,如下圖所示

在我們要的區間開始位置(x1,y1)處 +c,根據字首和的性質,那麼它影響的就是整個黃色部分,多影響了兩個藍色部分,所以在兩個藍色部分 -c 消除 +c 的影響,而兩個藍色部分重疊的綠色部分多了個 -c 的影響,所以綠色部分 +c 消除影響。所以對應的計算方法如下:

diff[x1][y1] += c;

diff[x1][y2+1] -=c;

diff[x2+1][y1] -=c;

diff[x2+1][y2+1] += c;

我的oj,

輸入乙個 n 行 m 列的整數矩陣,再輸入 q 個操作,每個操作包含五個整數 x1,y1,x2,y2,c,其中 (x1, y1) 和 (x2, y2) 表示乙個子矩陣的左上角座標和右下角座標。

每個操作都要將選中的子矩陣中的每個元素的值加上 c。

請你將進行完所有操作後的矩陣輸出。

第一行包含整數 n,m,q。

接下來 n 行,每行包含 m 個整數,表示整數矩陣。

接下來 q 行,每行包含 5 個整數 x1,y1,x2,y2,c,表示乙個操作。

共 n 行,每行 m 個整數,表示所有操作進行完畢後的最終矩陣。

3 4 3

1 2 2 1

3 2 2 1

1 1 1 1

1 1 2 2 1

1 3 2 3 2

3 1 3 4 1

2 3 4 1

4 3 4 1

2 2 2 2

1 ≤ n, m ≤ 1000,

1 ≤ q ≤ 100000,

1 ≤ x1 ≤ x2 ≤ n,

1 ≤ y1 ≤ y2 ≤ m,

−1000 ≤ c ≤ 1000,

−1000 ≤ 矩陣內元素的值 ≤ 1000

這是乙個二維差分的模板題。

下面我們根據樣例輸入來分析一下,樣例輸出是如何得到的。

初始狀態的差分陣列 diff 為

1  1 0 -1

2 -2 0 0

-2 1 0 1

第一次操作為 1 1 2 2 1,得到差分陣列 diff 變為

2  1 -1 -1

2 -2 0 0

-3 1 1 1

第二次操作為 1 3 2 3 2,得到差分陣列 diff 變為

2  1  1 -3

2 -2 0 0

-3 1 -1 3

第二次操作為 1 3 2 3 2,得到差分陣列 diff 變為

2  1  1 -3

2 -2 0 0

-2 1 -1 3

最終,我們可以根據差分陣列 diff 求出對應的陣列。

從題目中知道,n 的最大值為 1000,因此我們定義陣列為 1004。

陣列的每個數範圍為 [-1000, 1000],c 的範圍為 [-1000, 1000],運算元 q 最大值為 100000。因此我們可以計算出,經過 q 次操作後,最大的資料為 1000+1000*100000 = 10^8+1000,在 int 的表示範圍內。同理最小的資料將是 -1000+(-1000*100000)=-10^8-1000,也在 int 的表示範圍內。

#include using namespace std;

const int maxn = 1e3+6;

const int maxm = 1e3+6;

int a[maxn][maxm] = {};

int diff[maxn][maxm] = {};

int main()

}for (i=0; i

差分矩陣 二維差分

輸入乙個n行m列的整數矩陣,再輸入q個操作,每個操作包含五個整數x1,y1,x2,y2,c,其中 x1,y1 和 x2,y2 表示乙個子矩陣的左上角座標和右下角座標。每個操作都要將選中的子矩陣中的每個元素的值加上c。請你將進行完所有操作後的矩陣輸出。輸入格式 第一行包含整數n,m,q。接下來n行,每...

一維差分與二維差分

自 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 ...

AcWing 差分矩陣 二維差分

時 空限制 1s 64mb 輸入乙個n行m列的整數矩陣,再輸入q個操作,每個操作包含五個整數x1,y1,x2,y2,c,其中 x1,y1 和 x2,y2 表示乙個子矩陣的左上角座標和右下角座標。每個操作都要將選中的子矩陣中的每個元素的值加上c。請你將進行完所有操作後的矩陣輸出。第一行包含整數n,m,...