二維樹狀數組

二維樹狀數組

樹狀數組(Binary Indexed Tree(BIT), Fenwick Tree)是一個查詢和修改複雜度都為log(n)的數據結構。主要用於查詢任意兩位之間的所有元素之和,但是每次只能修改一個元素的值;經過簡單修改可以在log(n)的複雜度下進行範圍修改,但是這時只能查詢其中一個元素的值(如果加入多個輔助數組則可以實現區間修改與區間查詢)。 而二維樹狀數組在樹狀數組的基礎上增加了一個維度,是一個由數字構成的大矩陣,能進行兩種操作對矩陣里的某個數加上一個整數(可正可負)或查詢某個子矩陣里所有數字的和,要求對每次查詢,輸出結果。

定義

二維樹狀數組是在樹狀數組的基礎上拓展而來的一個由數字構成的大矩陣,能進行兩種操作對矩陣里的某個數加上一個整數(可正可負)或查詢某個子矩陣里所有數字的和,要求對每次查詢,輸出結果。一維樹狀數組很容易擴展到二維,在二維情況下:數組A[][]的樹狀數組定義為:

推理過程

代碼

在二維情況下,如果修改了A[i][j]=delta,則對應的 二維樹狀數組更新函式為:

在二維情況下,求子矩陣元素之和∑ a[i][j](前i行和前j列)的函式為

其餘函式為:

例題

問題

給定一個n×n矩陣A,它的元素是0或1。A[ i ][ j 意味著第i行j列的數值。最初我們有A[ i ][ j ]= 0(1 < = i,j = n)。

我們可以用下列方式改變矩陣。給定一個矩形的左上角是(X1,Y1),右下角是(x2,y2),我們改變矩形的所有元素的使用“ not”操作(如果它是一個“0”,然後把它換成“1”,否則換成“0”)。為了維護矩陣的信息,你被要求編寫一個程式來接收和執行兩種指令。

1.C x1 y1 x2 y2(1<= X1<=X2<=N,1<=Y1<=Y2<=N)

通過左上角為(x1,y1),右下角為(x2,y2)的矩形來改變矩陣的值

即將這個矩形範圍內的值全部取反

2.Q x y(1≤x,y≤n)查詢A[ x ][ y ]

實現代碼如下

C++:

Pascal:

相關詞條

熱門詞條

聯絡我們