poj 3667 Hotel 區間合併

2021-08-27 05:32:45 字數 2056 閱讀 5424

思路:

昨天開始學習線段樹的區間合併問題,看這個題時,沒一點思路,網上搜各種部落格,發現大部分都是貼**,思路說的很少,以至於我昨天下午到晚上還沒把題和線段樹聯絡起來,弱爆了……= = ,今天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...