二維線段樹 poj 2155

2021-10-03 19:51:48 字數 1041 閱讀 7896

題意:t組樣例 ,輸入 n,m,表示n*n的矩陣進行m次操作 ,c: 輸入兩個座標 ,組成的矩形 進行取反操作 ,q:對輸的座標位置輸入其值。

思路:一開始想的是用1000(表示x軸)個線段樹(對每段y進行操作)來記錄,也是二維的 ,第一維暴力 ,第二維線段樹 ,結果ti ,原來還有二維線段樹,每個對應的節點都有一顆線段樹(好像跟我的差不多)

更新:先找到x對應的區間 ,對相應的y區間修改。

查詢:對於每次找的x 都進行一次查詢y 

#include#include#include#includeusing namespace std;

int e[4040][4040],n;

/*x對應的每個節點都有一顆線段樹*/

void updatey(int x,int y,int l,int r,int o,int t)

int mid=(l+r)>>1;

if(x<=mid) updatey(x,y,l,mid,o<<1,t);

if(y>mid) updatey(x,y,mid+1,r,o<<1|1,t);

return ;

}void updatex(int x,int y,int t1,int t2,int l,int r,int o)

int mid=(l+r)>>1;

if(x<=mid) updatex(x,y,t1,t2,l,mid,o<<1);

if(y>mid) updatex(x,y,t1,t2,mid+1,r,o<<1|1);

return ;

}int ans;

void queryy(int x,int l,int r,int o,int t)

void queryx(int x,int y,int l,int r,int o)/*查詢所有的x線段樹*/

int main()

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

}printf("\n");

}return 0;

}

poj2155 二維線段樹

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

POJ 2155 二維線段樹

題意 給乙個01矩陣,每次可以進行操作將 x1,x2,y1,y2 內的所有元素0變1 1變0。也可以進行詢問,詢問某乙個格仔的0和1。輸出詢問。思路 二維線段樹版題,稍微轉化一下記錄查詢乙個點時它所經過的路徑上經過偶數次修改就為0,奇數次為1。線段樹有兩種寫法,第一種把下標放在樹的結點中,時不時會m...

poj 2155 二維線段樹

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