POJ 2155 樹套樹 線段樹套線段樹

2021-06-26 15:37:33 字數 1059 閱讀 5749

matrix 樓教主出的題目。

題意:乙個矩陣初始值都為0,每次給「c x1 y1 x2 y2" 去反轉這個矩陣。或者"q x1 y1"查詢這個點是0/1。

第一次接觸樹套樹的題目。

一句ac:對於基本的線段樹,再在每個節點建乙個y方向上的線段樹。tree[n][m]

這道題目更新的時候,對於x方向就是(x1,x2)這個區間,再在其上對y1,y2進行更新。

對於查詢,x方向上,自頂向下到x1都要對y進行查詢(更新的區間必包括該點),y方向上則更新到y1.

#include #include #define maxn 1005

#define mem(a) memset(a, 0, sizeof(a))

bool tree[maxn<<2][maxn<<2];

int x, n, t;

int num, x1, x2, y1, y2;

char ch[10];

void updatey(int yl,int yr,int xp,int yp)

int mid=(yl+yr)>>1;

if(y1<=mid) updatey(yl,mid,xp,yp<<1);

if(y2>mid ) updatey(mid+1,yr,xp,yp<<1|1);

}void updatex(int xl,int xr,int xp)

int mid=(xl+xr)>>1;//下面這句剛開始寫錯了,按照build寫了,忘記是個更新操作...

if(x1<=mid) updatex(xl,mid,xp<<1);

if(x2>mid) updatex(mid+1,xr,xp<<1|1);

}void queryy(int yl,int yr,int xp,int yp)

void queryx(int xl,int xr,int xp)

int main()

{ while(~scanf("%d", &x))while(x--)

{mem(tree);

scanf("%d %d%*c", &n,&t);

for(int i=0;i

POJ 2155 二維線段樹 線段樹套線段樹

題目大意 二維區間裡,某個矩形裡都是01,選乙個矩形,裡面數字01翻轉。最後不停的問某個座標是0還是1.poj不支援c 1所以常用標頭檔案要注釋掉很多 大致二維線段樹就是這樣的了 每個節點都是乙個線段樹。qc大爺說二維線段樹不支援打標記。好像這題也不用打標記了,只能標記永久化 include inc...

樹套樹 線段樹套set

請你寫出一種資料結構,來維護乙個長度為 n 的序列,其中需要提供以下操作 1 pos x,將 pos 位置的數修改為 x。2 l r x,查詢整數 x 在區間 l,r 內的前驅 前驅定義為小於 x,且最大的數 數列中的位置從左到右依次標號為 1 n。區間 l,r 表示從位置 l 到位置 r 之間 包...

初學樹套樹 線段樹套Treap

樹套樹是乙個十分神奇的演算法,種類也有很多 像什麼樹狀陣列套主席樹 樹狀陣列套值域線段樹 zkw 線段樹套 vector 等等。不過,像我這麼弱,當然只會最經典的線段樹套 treap 啦。線段樹我相信大家都會的,treap 可以看一下這篇部落格 簡析平衡樹 二 treap 線段樹套 treap 的思...