原題鏈結
題意:給定乙個初始為0的矩陣,每次可以使乙個方塊內的數由0變成1或者由1變成0,詢問某一點是1還是0
思路:普通修改肯定過不了,但是有一點,某乙個點如果被改變k次那麼這個點就是k&1或者說k%2。基於這個思路,我們可以用樹狀陣列方便地得出某乙個點被修改過多少次。假設sum[i][j]可以求得i,j這個點被改變的次數,那麼如果我們給出
1
2 2c 1 1 2 2
q 2 2
這組資料,那麼我們我們可以先讓sum[i][j]成為如下的樣子
x\y 1 2 3 4
1 1 1 1 1
2 1 1 1 1
3 1 1 1 1
4 1 1 1 1
接下來讓y>=3的部分全減去1
x\y 1 2 3 4
1 1 1 0 0
2 1 1 0 0
3 1 1 0 0
4 1 1 0 0
接下來讓x>=3的部分全減去1
x\y 1 2 3 4
1 1 1 0 0
2 1 1 0 0
3 0 0 -1 -1
4 0 0 -1 -1
接下來讓x>=3,y>=3的部分全加上1
x\y 1 2 3 4
1 1 1 0 0
2 1 1 0 0
3 0 0 0 0
4 0 0 0 0
這不就是我們想要的將左上角為(1,1),右下角為(2,2)的部分全變成1的效果嗎?但是sum這個函式的結果是這個樣子,但是實際上對於用來儲存資料的bit陣列卻不是這個樣子,它略有不同他是這個樣子的
1 1 0 1
1 1 0 1
0 0 0 0
1 1 0 1
1 1 -1 0
1 1 -1 0
0 0 0 0
1 1 -1 0
1 1 -1 0
1 1 -1 0
-1 -1 0 -1
0 0 -1 -1
1 1 -1 0
1 1 -1 0
-1 -1 1 0
0 0 0 0
但是執行對於樹狀陣列的求和操作的時候出來的結果就是之前的那些矩陣了
**如下
#include #include #include using namespace std;
const int maxn = 1005;
int bit[maxn][maxn];
int k,n,m;
int lowbit(int x)
void add(int x,int y,int v)
int query(int x,int y)
int main()
else
} cout << endl;
}}
POJ 2155 Matrix 二維樹狀陣列
又是一道樹狀陣列的題目,而且是一道二維的好題 題目要求是,一些操作,可能是對某個矩陣內的所有值取反,可能是問的是某個位置的值 如圖 假如我們要把b矩陣的所有值都取反,我們只需要操縱矩陣的四個頂點即可,更新左下角頂點的值增1相當於把區域abcd的變換次數增1,左上角頂點的值增1,相當於區域ac的變換次...
二維線段樹 POJ 2155 Matrix
風格 www.notonlysuccess.com 題目大意 剛開始,整個矩陣為0 c操作 對乙個矩陣進行0,1取反 q操作求該點的數字是什麼 演算法 二維線段樹,具體自己模擬吧 include include include include include include include incl...
POJ 2155 Matrix 二維線段樹
題目大意 乙個二維座標軸上有很多點,點不是0就是1。然後又兩種操作。c 改變以 x1,y1 為左上頂點 x2,y2 為右下頂點 中的每乙個點 0變1 1變0 q 輸出 a x y 然後每次改變都取異或 這樣的話就意味著改變偶數次就變回來了 奇數次的話就是做了改變的 include include i...