在此不給予證明,但是證明很簡單。二維樹狀數組成塊更新,查定點的值。
我們以一維的推廣,我們可不可以成塊更新轉化為修改一些點的值,然後求點的值轉化統計一塊的和?
我們可以構造乙個m矩陣,讓m矩陣初始化為0,我們可以讓座標(x,y)的值等於以(1,1)和(x,y)組成的m子矩陣的元素之和(你看看,這個條件在剛開始的時候是成立的),我們更新以(x1,y1)和(x2,y2)組成的矩陣的值的時候,我們只需在m矩陣中插入(x1,y1)(x1,y2+1)(x2+1,y1)(x2+1,y2+1)的值。
比如我們將以(x1,y1)和(x2,y2)組成的矩陣的元素都加上val。那麼我們將(x1,y1)+val,(x1,y2+1)-val,(x2+1,y1)-val,(x2+1,y2+1)+val即可。
題意:對乙個n∗m的矩陣進行一些操作和查詢,操作:成塊修改。查詢:求某個元素的值,
#include
using
namespace std;
int bt[
1100][
1100];
int maxn,maxm;
//矩陣的行和列
intlowbit
(int k)
void
modify
(int x,
int y,
int val)
}int
getsum
(int x,
int y)
//等於其左上角矩陣的和
return ans;
}void
update
(int x1,
int y1,
int x2,
int y2,
int val)
//更新差值矩陣
intmain()
cin>>q;
//查詢操作的次數
while
(q--
)}
樹狀陣列 二維
首先初始陣列還是a陣列,二維的 搞乙個b陣列,也是二維,b i 就是a陣列第i行的一維樹狀陣列 b 2 1 a 2 1 b 2 2 a 2 1 a 2 2 b 2 3 a 2 3 最後我們來搞乙個c陣列,當然它還是二維的hhh c 1 就是第一行的樹狀陣列,c 2 是第一行加第二行,c 3 是第三行...
二維樹狀陣列
什麼是二維樹狀陣列 二維樹狀陣列 單點修改,區間查詢 include const int maxn 4096 5 typedef long long ll ll c maxn maxn int n,m int lowbit int x void modify int x,int y,int z ll...
樹狀陣列 二維樹狀陣列模板
樹狀陣列模板 int lowbit int x int add int x,int val int que int x 模板題 題解 include include include using namespace std int c 300000 rank 300000 int n int lowb...