POJ3667 Hotel 線段樹區間合併

2021-09-26 13:33:44 字數 1319 閱讀 7929

酒店有n個房間,兩種操作:

1 a:詢問是不是有連續長度為a的空房間,有的話住進最左邊

2 a b:將[a,a+b-1]的房間清空

核心:維護每個區間的最大空餘長度是多少。

需要3個變數:

ls[i]:左端點向右連續最多有多少空房子

rs[i]:右端點向左連續最多有多少空房子

tree[i]:整個區間最多連續有多少空房子

tree[i] = max(rs[i * 2]+ls[i * 2+1], max(tree[i * 2], tree[i * 2+1])),很好理解,要麼是左半部分的最大長度,要麼是右半部分的最大長度,要麼是跨越左右。

#include #include #include #define lson l, mid, root<<1

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

using namespace std;

const int inf = 0x3f3f3f3f;

typedef long long ll;

const int maxn = 50000+5;

int tree[maxn<<2], ls[maxn<<2], rs[maxn<<2]; // 區間內最大連續空閒長度

int lazy[maxn<<2];

void push_down(int rt, int len)

void push_up(int rt, int len)

void stree_build(int l, int r, int root)

// val: 1---房客入住, 0----退房

void update(int la, int rb, int l, int r, int root, int val)

push_down(root, r-l+1);

int mid = (l+r) >> 1;

if(la <= mid) update(la, rb, lson, val);

if(rb > mid) update(la, rb, rson, val);

push_up(root, r-l+1);

}int query(int l, int r, int root, int c)

int main()

int pos = query(1, n, 1, c);

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

update(pos, pos+c-1, 1, n, 1, 1);

} // 退房

else

} }return 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...

POJ 3667 hotel 線段樹區間合併

有n房間,序號1 n,m次詢問,詢問 1 b 代表入住b人,你需要找一段連續的6間房間,若有返回序號最小的房間序號,若沒有,返回0 詢問 2 b c 代表清理房間b c,清理之後b c房間可以入住。思路 記錄某區間的最大連續房間個數 區間從左邊第乙個開始的連續空房間個數,右邊最後乙個往前連續的空房間...