hdu4819 poj2019 二維線段樹

2021-07-02 22:00:57 字數 2783 閱讀 4025

樹套樹~~

x線段樹的每乙個點都對應乙個y線段樹

這樣就形成了二維線段樹

二維線段樹最大的理解難點在於對點的push_up,即由右往左更新由下往上更新這兩個地方,還有就是x線段的每乙個點都對應乙個y線段樹

hdu 4819

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define exp 1e-8

#define inf 0x3f3f3f3f

#define ll long long

#define set(a,b) memset(a,b,sizeof(a));

#define set(a,b) memset(a,b,sizeof(a));

#define for1(a,b) for(int a=1;a<=b;a++)//1---(b)

#define for0(a,b) for(int a=0;a<=b;a++)//0---(b)

void bug(string st="bug")

while(ch>='0'&&ch<='9')

m=x*f;

}template

inline

void read(__ll &m)

template

inline

void read(__ll &m,__ll &a)

template

inline

void read(__ll &m,__ll &a,__ll &b)

#define lson l,mid,rt<<1

#define rson mid+1,r,rt<<1|1

#define maxn 900

int n,m; //n*m的矩陣

int maxn[maxn<<2][maxn<<2];

int minn[maxn<<2][maxn<<2];

/*更新方式有兩種,一種是往上壓,還有是往左壓。

往左壓:x是乙個區間,y是乙個值,往左壓

往上壓:y是乙個區間,x是乙個值或者說是乙個固定區間

一般執行先後是:先往左壓,後往上壓

一般來說更新x,都是從下往上更新,所以一般沒有固定的push_up_x的函式

如果硬是寫的話也可以,只不過需要花費額外的時間

所以最好的方式是根據更新y的函式來更新x

如build_y,,,modify_x 就有更新x的功能。

因為省去了呼叫一些多餘的區間,所以時間大大節省了

*/void push_up_y(int rt,int f)

void build_y(int l,int r,int rt,int f,bool flag)

read(maxn[f][rt]);

minn[f][rt]=maxn[f][rt];

return ;

}int mid=l+r>>1;

build_y(lson,f,flag);

build_y(rson,f,flag);

push_up_y(rt,f); //上壓

}void build_x(int l,int r,int rt)

int mid=l+r>>1;

build_x(lson);

build_x(rson);

build_y(1,m,1,rt,1); //每個點都對應乙個線段樹~~所以建立並更新

}int query_maxn_y(int l,int r,int rt,int f,int y1,int y2)

int query_maxn_x(int l,int r,int rt,int x1,int x2,int y1,int y2)

int query_minn_y(int l,int r,int rt,int f,int y1,int y2)

int query_minn_x(int l,int r,int rt,int x1,int x2,int y1,int y2)

void modify_y(int l,int r,int rt,int f,int y,int val,bool flag)

else maxn[f][rt]=minn[f][rt]=val;

return ;

}int mid=l+r>>1;

if(y<=mid)

modify_y(lson,f,y,val,flag);

else modify_y(rson,f,y,val,flag);

push_up_y(rt,f); //上壓

}void modify_x(int l,int r,int rt,int x,int y,int val)

int mid=l+r>>1;

if(x<=mid)

modify_x(lson,x,y,val);

else modify_x(rson,x,y,val);

modify_y(1,m,1,rt,y,val,1); //這個區間也要更新

}int main()

}return

0;}

HDU 4819 二維線段樹

13年長春現場賽的g題,赤裸裸的二維線段樹,單點更新,區間查詢 不過我是第一次寫二維的,一開始寫t了,原因是我沒有好好利用行段,說白一點,還是相當於枚舉行,然後對列進行線段樹,那要你寫二維線段樹幹嘛 二維就是在每個行段也建一棵樹,來代表這個區間的行裡的某些列的值 其他操作倒是不難,因為有一維的功底,...

HDU 4819 Mosaic 二維線段樹

題目大意 裸題,不解釋,上模板。比較省記憶體的寫法 hdu 4819 pragma comment linker,stack 102400000,102400000 include include include include include include include include inc...

HDU 4819 Mosaic 二維線段樹

給定乙個 的矩陣,每個格仔都有乙個數,再給出 個詢問,每次詢問以 為中心的邊長為 的正方形矩陣中的最大值和最小值,並修改 的值為 四叉樹 對於查詢矩陣的最值 修改問題,考慮二維線段樹,參照一維線段樹的寫法 每次將區間二分成兩個子區間,對應矩陣應對 同時二分,也就是 個子矩陣,即左上 右上 左下,右下...