1. 程式人生 > 資訊 >初代 Apple Watch 被列入蘋果公司“復古過時產品”名單

初代 Apple Watch 被列入蘋果公司“復古過時產品”名單

二維樹狀陣列可以實現在平面上的區域加、區域查詢等操作。

區域修改

我們在一維時維護樹狀陣列的區間操作時,對其進行了差分。類比一維的思想,我們在二維平面上也對樹狀陣列差分。

我們來看二維的字首和:

\[sum(i,j)=sum(i-1,j)+sum(i,j-1)-sum(i-1,j-1)+a(i,j) \]

可以使二維差分陣列為這樣的形式:

\[d(i,j)=a(i,j)-d(i-1,j)-d(i,j-1)+d(i-1,j-1) \]

(發現了吧,這其實就是)

比如我們有一下這個全為 \(0\) 的矩陣,那麼給中間 \(2\times 3\) 的矩陣差分後長成這樣:(“o” 表示操作區域)

0 0 0 0 0    0 0 0 0 0
0 o o o 0 -> 0 +x 0 0 -x
0 o o o 0    0 0 0 0 0
0 0 0 0 0    0 -x 0 0 +x

這樣我們就簡單地完成了區域加的操作。

區域查詢

根據差分陣列的定義,我們不難發現,對於點 \((x,y)\) ,它的二維字首和就是:

\[\sum_{i=1}^x\sum_{j=1}^y\sum_{h=1}^i\sum_{k=1}^j d[h][k] \]

但我們類比一下一維樹狀陣列的區間求和,我們亦可以統計每個 \(d[h][k]\) 出現的次數,我們就可以發現 \(d[1][1]\) 出現了 \((x\times y)\) 次,\(d[1][2]\) 出現了 \(x\times(y-1)\) 次……\(d[h][k]\) 出現了 \((x-h+1)\times (y-k+1)\) 次。

則原式整理得:

\[\sum_{i=1}^x\sum_{j=1}^y d[i][j]\times (x-i+1)\times (y-j+1) \]

分解得:

\[\sum_{i=1}^x\sum_{j=1}^y d[i][j]\times [(xy-xj+x)+(-yi+ij-i)+(y-j+1)] \]

最後得:

\[\sum_{i=1}^x\sum_{j=1}^y d[i][j]\times (xy+x+y+1)-d[i][j]\times i(y+1)-d[i][j]\times j(x+1)+d[i][j]\times i\times j \]

根據我們最後分解出來的公式,我們需要維護四個陣列 \(d[i][j],d[i][j]\times i,d[i][j]\times j,d[i][j]\times i\times j\)

,從而實現區間查詢。

例題 — P4514 上帝造題的七分鐘

即二維樹狀陣列裸題。

$\texttt{code}$
咕咕咕

參考文章