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