題目大意:給你乙個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...