這道題應該算是比較經典的線段樹了
題意是:
這座巨型賓館在一條超長走廊上有n(1 ≤ n ≤ 50000)個排成一排的房間,每個房間都能欣賞到蘇必利爾湖的好景色。現在所有的房間都是空的。
現在bessie等旅客們正在不斷地發出訂房和退房要求。你需要接受m(1 ≤ m < 50000)條指令:
每條指令的第乙個數字為1或2。如果是1,後面將有乙個整數d表示顧客要預定的房間數。注意,這些房間必須是連續的。如果能夠滿足旅客的訂房要求, 輸出滿足要求的第乙個房間的編號(例如,要訂房6間,輸出3表示3, 4, 5, 6, 7, 8是滿足要求的),這樣的編號必須是可能的編號裡面最靠前的。如果不能滿足要求,輸出0。
如果是2,後面將有兩個整數x和d表示顧客要退掉x, x + 1, x + 2, ... , x + d - 1這d間房。對於這樣的指令什麼都不輸出
線段樹儲存的資訊有,cover代表是否有人,msum代表區間內最大的連續長度,lsum是從左結點往右的連續長度,rsum是從右結點往左的連續長度。
/*
id: sdj22251
prog: inflate
lang: c++
*/#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define maxn 50005
#define inf 10000000000000000ll
#define l(x) x<<1
#define r(x) x<<1|1
#define pi acos(-1.0)
#define eps 1e-7
using namespace std;
struct node
tree[4 * maxn];
void down(int c)
}void up(int c)
void make_tree(int s, int e, int c)
void update(int s, int e, int p, int c)
down(c);
if(tree[c].mid >= s) update(s, e, p, l(c));
if(tree[c].mid < e) update(s, e, p, r(c));
up(c);
}int query(int p, int c)
int main()
}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房間可以入住。思路 記錄某區間的最大連續房間個數 區間從左邊第乙個開始的連續空房間個數,右邊最後乙個往前連續的空房間...