POJ3667 Hotel (找連續k個空位)

2021-08-20 08:41:23 字數 2148 閱讀 6184

火山經營著乙個停車場,假設的停車場有n車位(編號1-n)都在一條線上,最初所有車位都沒停車。經常有人來定車位,

他要定連續的k(1 ≤ k ≤ n)個車位。火山要確定是否能夠滿足客人的要求,如果能,他要將這k個連續的車位安排在編

號最小的地方停下。若不能,則客人不停在火山的停車場。在某一時間,有些車會被車主開走了。火山的停車場很大,

火山想讓學弟學妹寫個程式幫助他。

input

第1行輸入 n 和 m。n是車位個數,m是(停車和開走車操作的總次數)

接下來m行,先輸入操作型別(1或2)

若是1,表示有人來停車,再輸入k

若是2,再輸入l,r, 表示區間[l,l+r] 的車被開走了。

n (1 ≤ n ≤ 50,000) m (1 ≤ m < 50,000)

output

當輸入為1時,若火山的停車場有連續的k個車位,那麼輸出第一輛車停的最小的編號,否則輸出0。

sample input

10 6

1 3

1 3

1 3

1 3

2 5 5

1 6

sample output

1 4

7 0

5 hint

樣例解釋:停車場有10個車位,6次操作。第乙個人定了3個連續的車位時,第一輛車停在1的位置(即輸出)

第二次預定3個連續的車位時,第一輛車停在4的位置,因為前三個位置被人定了。同理,下個人再來定時,

只能從編號為7的車位開始停。此時(1-9)的車位都停了車,下個人在來定三個位置,就不能滿足他的要求,輸出0.

2 5 5。 5開始的連續5個車位都被人開走了。現在(5-10)都是空的,下個人來定時3個位置,火山就把他們安排在

起始為置為5的位置。

線段樹區間合併問題。

線段樹問題的難點在於確定結點維護的資訊以及區間更新。

lsum表示從該結點維護的區間的最左側向右連續的最多空位數。rsum表示從該結點維護的區間的最右側向左連續的最多空位數。sum表示該結點維護的區間的最多連續空位數。

lsum和rsum的更新直接由左右子結點的lsum和rsum更新即可。

sum的更新不僅與左右子結點的sum有關,還與左右子結點的lsum和rsum有關。這就是問題的難點所在。區間資訊的更新不是那麼直接,需要自己確定好需要哪些資訊來完成更新。

#include 

#include

#include

#include

#define lson p*2

#define rson (p*2+1)

using namespace std;

const int maxn=7e4+100;//5e4不行?很迷...,哪位大佬知道原因,告訴我啊orz

struct node

t[maxn<<2];//四倍空間

void up(int p)//由子結點回溯更新父結點。}

void down(int p)

void build(int p,int l,int r)//建樹

build(lson,l,mid);

build(rson,mid+1,r);

up(p);

}void update(int p,int x,int y,int c)

down(p);

if(y<=mid) update(lson,x,y,c);

else

if(x>mid) update(rson,x,y,c);

else

up(p);

}int query(int p,int k)

down(p);

if(t[lson].sum>=k) return query(lson,k);

else

if(t[lson].rsum+t[rson].lsum>=k)

else

return query(rson,k);

}int main()

else ans=query(1,k);

printf("%d\n",ans);

update(1,ans,ans+k-1,0);

}else}}

return

0;}

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 區間合併

思路 昨天開始學習線段樹的區間合併問題,看這個題時,沒一點思路,網上搜各種部落格,發現大部分都是貼 思路說的很少,以至於我昨天下午到晚上還沒把題和線段樹聯絡起來,弱爆了 今天lky給發了個好點的講解部落格,終於看懂了,寫 時,乙個低階錯誤折磨了我一天,找了一天的錯 唉,各種弱 詳細說下這題過程吧。一...

POJ 3667 Hotel 線段樹區間合併

這道題應該算是比較經典的線段樹了 題意是 這座巨型賓館在一條超長走廊上有n 1 n 50000 個排成一排的房間,每個房間都能欣賞到蘇必利爾湖的好景色。現在所有的房間都是空的。現在bessie等旅客們正在不斷地發出訂房和退房要求。你需要接受m 1 m 50000 條指令 每條指令的第乙個數字為1或2...