POJ 2155 二維線段樹

2021-07-09 12:34:34 字數 2084 閱讀 3553

題意:

給乙個01矩陣,每次可以進行操作將[x1,x2,y1,y2]內的所有元素0變1、1變0。也可以進行詢問,詢問某乙個格仔的0和1。

輸出詢問。

思路:

二維線段樹版題,稍微轉化一下記錄查詢乙個點時它所經過的路徑上經過偶數次修改就為0,奇數次為1。

線段樹有兩種寫法,第一種把下標放在樹的結點中,時不時會mle。第二種是放在詢問的函式裡。這時候似乎開乙個巨集定義能夠省很多寫法,定義乙個左兒子和右兒子。

二維的線段樹有點類似二維樹狀陣列,無非是兩邊更新下,多寫一步啦。

開struct會mle,寫太殘過段時間補乙個好一點的版。

原始碼:

#include 

#include

#include

#include

#include

#include

#include

using namespace std;

const int maxn = 1000 + 5;

//struct tree

//// tree(int _lx, int _rx, int _ly, int _ry, int _val)

//}tree[maxn * 4][maxn * 4];

int tree[maxn * 4][maxn * 4];

int n, q;

char str[10];

//void buildy(int ox, int lx, int rx, int oy, int ly, int ry)

////void buildx(int ox, int lx, int rx, int oy, int ly, int ry)

//void updatey(int ox, int oy, int y1, int y2, int ly, int ry)

int mid = (ly + ry) >> 1;

if(mid >= y1) updatey(ox, (oy << 1), y1, y2, ly, mid);

if(mid < y2) updatey(ox, (oy << 1) +1 , y1, y2, mid + 1, ry);

}void updatex(int ox, int x1, int x2, int oy, int y1, int y2, int lx, int rx, int ly, int ry)

int mid = (lx + rx) >> 1;

if(x1 <= mid) updatex(ox << 1, x1, x2, oy, y1, y2, lx, mid, ly, ry);

if(x2 > mid) updatex((ox << 1) + 1, x1, x2, oy, y1, y2, mid + 1, rx, ly, ry);

}int queryy(int ox, int

x, int oy, int

y, int lx, int rx, int ly, int ry)

// }

if(ly == ry) return tree[ox][oy];

int ans = tree[ox][oy];

int mid = (ly + ry) >> 1;

if(y

<= mid) ans += queryy(ox, x, oy << 1, y, lx, rx, ly, mid);

else ans += queryy(ox, x, (oy << 1) + 1, y, lx, rx, mid + 1, ry);

//printf("in queryy ox = %d, x = %d, oy = %d, y = %d, ans = %d\n", ox, x, oy, y, ans);

return ans;

}int queryx(int ox, int

x, int oy, int

y, int lx, int rx, int ly, int ry)

int main()

else

// for(int i = 1 ; i <= 3 ; i++)}}

return

0;}

poj2155 二維線段樹

題目大意 給定初始n n矩陣,所有數都是0,然後有 c 操作 對左上角 x1,y1 到右下角 x2,y2 的矩陣中所有數取非,即0變1,或1變0 還有 q 操作 查詢點 x,y 的值並輸出。思路 構造乙個線段樹,每個結點還是線段樹,外圍線段樹表示x方向,子線段樹表示y方向。查詢時對結點 x,y 所在...

二維線段樹 poj 2155

題意 t組樣例 輸入 n,m,表示n n的矩陣進行m次操作 c 輸入兩個座標 組成的矩形 進行取反操作 q 對輸的座標位置輸入其值。思路 一開始想的是用1000 表示x軸 個線段樹 對每段y進行操作 來記錄,也是二維的 第一維暴力 第二維線段樹 結果ti 原來還有二維線段樹,每個對應的節點都有一顆線...

poj 2155 二維線段樹

在乙個二維陣列中,每次對乙個矩形內所有資料進行取反操作,並實時詢問某一位置的值。一般線段樹只支援對一維資料進行更新和查詢,但是這題給的是二維資料啊!這裡就需要用到二維線段樹了,即樹套樹,外層線段樹的每個結點裡面都有一顆線段樹。在實現二維線段樹的時候,一開始用加build函式的方式,記錄每個結點左右孩...