前面部分我們介紹了一維差分,下面我們擴充套件一下,來介紹二維差分。
我們有乙個矩陣,如下圖所示。
根據二維字首和表示的是右上角矩形的和,由於差分只涉及前面相鄰的數(由一維可以推出),並且由前面範圍的數相加得到這個位置的數。那麼模擬二維字首和和一維差分,可以簡單推測出二維差分的公式
如何從差分矩陣得到原矩陣呢?可以參考下面公式
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,...