POJ 2155 Matrix(二維樹狀陣列)

2021-07-10 12:11:31 字數 868 閱讀 9474

題意:操作c表示讓左上角為(x1,y1)右下角為(x2,y2)的矩形內所有的01取反,一開始的時候全部為0。q詢問(x,y)內是0還是1。

這道題可以把01取反看成是操作c的累加,如果某個單元被操作了奇數次,那麼相當於取反,否則就是沒有動。這道題和一維情況中改變區間查詢點的情況類似,只是將一維公升級成二維。如果現在要改變左上角為(x1,y1)右下角為(x2,y2)的矩形,那麼只要給乙個二維陣列中(x1,y1)(x2+1,y2+1)(x1,y2+1)(x1+1,y2)全部加上1,以(x1,y1)為例,在查詢(x,y)的時候,通過累加,會把以(1,1)為左上角,(x,y)為右下角的矩形中所有的數加起來,那麼如果(x1,y1)在這範圍內,對(x,y)而言,就被操作了一次。綜合起來,就是把以(x1,y1)為左上角,(n,n)為右下角的矩形內01取反。同理,其他也是一樣的。最後相互抵消後,相當於是讓左上角為(x1,y1)右下角為(x2,y2)的矩形內所有的01取反。

#include#include#include#include#define n 1005

using namespace std;

int n;

char s[3];

int c[n][n];

int lowbit(int x)

void change(int x, int y, int d)

x += lowbit(x);

}}int query(int x, int y)

x -= lowbit(x);

}return sum;

}int main()

if (s[0] == 'q')

}if (t) printf("\n");

}return 0;

}

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...