POJ 2155 Matrix(二維樹狀陣列)

2021-07-04 22:36:15 字數 1013 閱讀 5343

題意:有乙個矩陣,每次操作可以是編輯某個矩形區域,這個區域的0改為1,1改為0,每次查詢只查詢某乙個點的值是0還是1。

思路:這道題和一般的樹狀陣列有一點不同,這道題是區間修改,單點查詢,而樹狀陣列處理的是單點修改,所以我們可以改一下矩陣裡的每乙個值代表的意義。可以注意到我們只關注乙個點被翻轉了奇數次還是偶數次,令矩陣的元素a[i][j]表示矩形區域(1,1)到(i,j)的修改次數,這樣我們可以把區間修改轉化為四個端點的單點修改,即modify(x2, y2, 1); modify(x1-1, y1-1, 1); modify(x1-1, y2, 1); modify(x2, y1-1, 1)。

這樣一來查詢也變成了矩陣塊的和的查詢,即從(x,y)到(n,n)的和。這樣一來就可以用樹狀陣列來做了。

#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define eps 1e-6

#define ll long long

#define pii (pair)

//#pragma comment(linker, "/stack:1024000000,1024000000")

using namespace std;

//const int maxn = 100 + 5;

//const int inf = 0x3f3f3f3f;

int n, c[1050][1050];

int lowbit(int x)

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

} }

int sumv(int x, int y)

} return res;

} int q, kase = 0;

int main()

else

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