思路:
昨天開始學習線段樹的區間合併問題,看這個題時,沒一點思路,網上搜各種部落格,發現大部分都是貼**,思路說的很少,以至於我昨天下午到晚上還沒把題和線段樹聯絡起來,弱爆了……= = ,今天lky給發了個好點的講解部落格,終於看懂了,寫**時,乙個低階錯誤折磨了我一天,找了一天的錯……唉,各種弱……詳細說下這題過程吧。
一:存線段樹資料的陣列至少要有四個變數,也可六個(以六個為例)。
tree[ t ] 中 l r 分別表示 該節點的區間(這兩個可以不要),lsum 存的是 從本節點區間最左端開始(向右)一共有lsum個連續的空房間,rlsum 存的是 從本節點區間最右端開始(向左)一共有lsum個連續的空房間,sum存的是 本區間一共最多有 sum 個連續的空房間,loop 的值有三種 -1,0,1,延時標記,-1代表不需要操作,0代表要將此區間置空,1代表要將此區間置滿,注意loop延時標記用的,做過線段數的插線問線的延時標記這點就不難理解了。
二:關於push_up函式
void push_up(int l,int r,int t)
是當更新樹中一節點後 回溯更新該節點的父節點的 lsum rsum sum的值。。
我們可以發現 節點 t 的lsum rsum sum 值是與它左右兒子節點的lsum rsum sum值有關係的
t 節點的lsum 值 等於 他左兒子的lsum值 或 左兒子的lsum值 + 右兒子的lsum值 具體參考**理解
同理:rsum值也一樣……
對於 t 節點 的sum值等於 max( 左兒子的sum值,右兒子的sum值 ,左兒子的rsum值+右兒子的lsum值)
三:關於push_down函式
void push_down(int t)
else
tree[t].loop=-1;
}}
它就是與延時標記有關的 ,若該節點的 loop 值為 -1 就不需要執行,若為0,將左兒子的區間,右兒子的區間置空,若為1,則置滿,分別對應改變對應lsum rsum sum loop 值,改變兒子的之後 注意要將 該節點 的 loop值變為 -1
四:如何判斷 是否能找到連續長為x的房間
只需開始判斷 tree[ 1 ].sum 和 x 的值即可……
…………………………………感覺說的已經很清晰了,再具體就參考**吧……………………
ac**:
#include#include#define max 4*100000
#define mid(x,y) (x+y)>>1 //(x+y)/2
int a[max];
struct hello
tree[max];
int find_max(int a,int b,int c)
void push_down(int t)
else
tree[t].loop=-1;
}}void push_up(int l,int r,int t)
void build_tree(int l,int r,int t) // l,r 表示區間,t表示 區間節點
void updata_tree(int l,int r,int t,int cnt)
else
return;
}push_down(t);
int x=mid(tree[t].l,tree[t].r);
if(x>=r)
updata_tree(l,r,2*t,cnt);
else if(x+1<=l)
updata_tree(l,r,2*t+1,cnt);
else
push_up(tree[t].l,tree[t].r,t);
}int query_tree(int l,int r,int t,int cnt)
int main()
y=query_tree(1,n,1,x);
printf("%d\n",y);
updata_tree(y,y+x-1,1,1);
}else}}
}
poj 3667 Hotel(區間合併)
題目鏈結 poj 3667 hotel include include define maxn 55555 define lson l,m,rt 1 define rson m 1,r,rt 1 1 using namespace std int col maxn 2 延遲標記,值為1時表示住人,0...
POJ 3667 Hotel 線段樹區間合併
這道題應該算是比較經典的線段樹了 題意是 這座巨型賓館在一條超長走廊上有n 1 n 50000 個排成一排的房間,每個房間都能欣賞到蘇必利爾湖的好景色。現在所有的房間都是空的。現在bessie等旅客們正在不斷地發出訂房和退房要求。你需要接受m 1 m 50000 條指令 每條指令的第乙個數字為1或2...
poj3667 Hotel 線段樹 區間合併
題意 有乙個旅館初始有n個空位置,操作一找連續空位置長度為l的最左端,如果不存在輸0。操作二從 a,a b 1 區間的位置重新 置為空。思路 線段樹區間合併。線段樹維護四個資訊 1 區間連續為空地最長長度 2 從區間左端連續空地最長長度 3 從區間右端向左 連續空的最長長度 4 區間的懶惰標記 pu...