POJ Matrix 二維樹狀陣列)

2021-07-05 00:20:59 字數 954 閱讀 9755

題目大意:給你乙個n * n的矩陣a,有q次操作;

1. c x1 y1 x2 y2 ,將(x1 , y1) (x2 , y2)包含的子矩陣的數值翻轉,即0變1 , 1 變0

2. q x y , 查詢a[x][y]的值。

由於n最大是1000 , q最大是10000 , 暴力的話肯定是直接超時。 後來聽說是用樹狀陣列來寫的,用二維樹狀陣列記錄每個點變化的次數。每次更新乙個二維區間,查詢乙個二維點。 類似於一維的 更新線段, 查詢單點的寫法。

每次更新(x1 , y1) -> (x2 , y2)時需要四步:

add(x1 , y1 , 1)

add(x1 , y2 + 1 , 1)

add(x2 + 1,y1 , 1)

add(x2 + 1 , y2 + 1 , 1)

查詢時直接sum(x , y)即可。

咋一看起來很難, 但總的來說,想明白之後,這道題挺水的。

/* 二維樹狀陣列

* 用樹狀陣列記錄每個點變化的次數,

* 即更新區間,查詢單點

*/#include

#include

using

namespace

std;

const

int maxn = 1010;

int c[maxn][maxn] , n;

int lowbit(int x)

void add(int x , int y , int v)

x += lowbit(x);

}}int sum(int x , int y)

x -= lowbit(x);

}return rel;

}int main()

else

}cout

<< endl;

}return

0;}

樹狀陣列 二維

首先初始陣列還是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...