二維差分數組

介紹

二維差分數組跟一維相同,能快速的把「範圍」的操作簡化為幾個數值的操作。

依舊跟前綴和是對應的,套用差分之後的數組,想要變回來,就用前綴和找。


若原先陣列的某個區域固定加 33

差分數組要在做前綴合之後,變成原本的數組,因此最後差分數組的變化如下。

  • 原先數組: [0000000000000000][0000033003300000]\begin{bmatrix} 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0\\ \end{bmatrix} \to \begin{bmatrix} 0 & 0 & 0 & 0\\ 0 & 3 & 3 & 0\\ 0 & 3 & 3 & 0\\ 0 & 0 & 0 & 0\\ \end{bmatrix}

  • 差分數組: [0000000000000000][00000+3030000030+3]\begin{bmatrix} 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0\\ \end{bmatrix} \to \begin{bmatrix} 0 & 0 & 0 & 0\\ 0 & +3 & 0 & -3\\ 0 & 0 & 0 & 0\\ 0 & -3 & 0 & +3\\ \end{bmatrix}

圖片

我們修改的區域左上在 (1,1)(1,1) ,右下在 (2,2)(2,2) ,在差分數組當中,修改到的位置則是 (1,1),(1,3),(3,1),(3,3)(1,1),(1,3),(3,1),(3,3)

跟前綴和修改的位置是有所對應的,至於為什麼是這樣改,見下面的詳細步驟。

對差分數組 [00000+3030000030+3]\begin{bmatrix} 0 & 0 & 0 & 0\\ 0 & +3 & 0 & -3\\ 0 & 0 & 0 & 0\\ 0 & -3 & 0 & +3\\ \end{bmatrix} 做前綴合,從 (1,1)(1,1) 開始。   每次操作都是當前的數值,減去左邊,減去上面,加回左上角,將結果填回矩陣當中。

  操作會把數字的影響不斷往下帶,因此在遇到更新的範圍邊界時,要把影響抵銷掉,這就是為什麼會有兩個 3-3 出現在兩個邊界上,而右下角會受到兩次 3-3 影響,被額外扣除一次,因此要加回來補正。


  實際的差分數組會額外加入一圈0,跟前綴合是同樣的道理,這樣就不需要額外去判斷左,上,左上存不存在。

  至於為什麼要在右跟下也補 00 ,是因為操作 (x,y)(i,j)(x,y)\sim(i, j) 區域的時候,差分數組最多會到 (i+1,j+1)(i+1,j+1)

圖片

顯示設定

背景線條
顯示背景網格線條
懸停發光
滑鼠懸停時顯示霓虹效果
聚光燈
跟隨滑鼠的聚光燈效果
背景透明度
開啟透明玻璃效果
主題顏色
自訂主要顏色