POJ 2155 Matrix 二維樹狀陣列

2021-06-03 14:56:01 字數 1125 閱讀 9888

又是一道樹狀陣列的題目,而且是一道二維的好題

題目要求是,一些操作,可能是對某個矩陣內的所有值取反,可能是問的是某個位置的值

如圖

假如我們要把b矩陣的所有值都取反,我們只需要操縱矩陣的四個頂點即可,更新左下角頂點的值增1相當於把區域abcd的變換次數增1,左上角頂點的值增1,相當於區域ac的變換次數增1,右上角頂點的值增1,相當於區域c的變換次數增1,右下角頂點的值增1,相當於區域cd的變換次數增1,最後我們可以發現,除了b區域外,a,c,d,都增加了偶數次的變換,相當於沒有變化。所以,每次我們只需對四個頂點進行增1操作即可。在這裡,我們應用了樹狀陣列的乙個性質,就是如果乙個靠前的資料發生了變化,那麼和其相關的求和問題都發生了變化。

那麼問題問的是某個位置的值,比如(x,y),那麼在(1,1)(x,y)這個矩陣中,如果有一些數進行過增1操作,那麼必然(x,y)點的值也做了相應的變換。那麼問題就轉化為了求這個矩陣內所有值的和,然後判斷其奇偶性。

/*

id: sdj22251

prog: subset

lang: c++

*/#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define maxn 1005

#define inf 1000000000

#define eps 1e-7

using namespace std;

int a[maxn][maxn], n;

char s[5];

int lowbit(int x)

void modify(int x, int y, int val)

int get_sum(int x, int y)

int main()

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

}printf("\n");

}return 0;

}

二維線段樹 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...

POJ 2155 Matrix 二維線段樹

題目 題意 給乙個n n的全是0的矩陣,每次操作都是選乙個子矩陣對其中每一項都取反。每次詢問乙個具體位置的值 分析 這題很明顯的是個二維線段樹模板題,但是在具體實現過程中由於一種是用延遲更新的做法導致了幾次tle。以前從沒遇到過用了延遲更新還會超時的情況,於是認真分析了一下,發現由於每次查詢都一定查...