POJ 3667 hotel 線段樹區間合併

2021-08-14 19:11:49 字數 1070 閱讀 2411

有n房間,序號1-n,m次詢問,詢問「1 b」代表入住b人,你需要找一段連續的6間房間,若有返回序號最小的房間序號,若沒有,返回0;詢問「2 b c」代表清理房間b-c,清理之後b-c房間可以入住。

思路:記錄某區間的最大連續房間個數、區間從左邊第乙個開始的連續空房間個數,右邊最後乙個往前連續的空房間個數分別用sum、lsum、rsum表示。用cover表示某區間是否被入住,0表示全部未入住,1表示全部入住,-1表示部分入住。

見**#include#include#include#include#includeusing namespace std;

#define maxn 121111

int rsum[maxn<<2],lsum[maxn<<2],sum[maxn<<2],cover[maxn<<2];

void build(int l,int r,int node)

void pushdown(int node,int len)

}void pushup(int node,int len)

int cal(int a,int l,int r,int node)

void update(int l,int r,int c,int l,int r,int node)//c=1,入住後更新,c=0,清理房間更新

pushdown(node,r-l+1);//對當前區間進行操作先拆分

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

if(l<=mid)

update(l,r,c,l,mid,node<<1);

if(r>mid)

update(l,r,c,mid+1,r,node<<1|1);

pushup(node,r-l+1);//更新祖宗及合併

}int main()

{ int n,m;

while(scanf("%d%d",&n,&m)!=eof)

{build(1,n,1);

int a,b,c;

while(m--)

{scanf("%d",&a);

if(a==1)

{scanf("%d",&b);

if(sum[1]

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 (線段樹區間合併)

題意 有乙個旅館,對於入住的人,輸出連續房間的第乙個房號,使房號盡量靠前 對於離開的人,將他們的房間重新標記為沒有人住。思路 對於這個問題,需要維護三個資訊,區間內最大連續空房間 區間內緊靠左端點的最大連續空房間 區間內緊靠右端點的最大連續空房間 採用延遲標記,用loop來標記房間狀態,loop 1...