poj3667 Hotel 線段樹 區間合併

2021-06-25 09:40:40 字數 1305 閱讀 8984

題意:有乙個旅館初始有n個空位置,操作一找連續空位置長度為l的最左端,如果不存在輸0。操作二從[a,a+b-1]區間的位置重新

置為空。

思路:線段樹區間合併。線段樹維護四個資訊:(1) 區間連續為空地最長長度   (2) 從區間左端連續空地最長長度  (3) 從區間右端向左

連續空的最長長度  ( 4 )區間的懶惰標記  push_down更新左右子樹的4個資訊,push_up用更新左右子樹更新根區間。 詳見**:

// file name: poj3667.cpp //

// author: kereo //

// create time: 2023年09月02日 星期二 20時37分55秒 //

//***********************************//

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

const int maxn=50000+100;

const int inf=0x3fffffff;

#define l(x) (x<<1)

#define r(x) (x<<1|1)

int n,m;

struct node

segtree[maxn<<2];

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

void push_down(int rt)

}void push_up(int rt)

void update(int rt,int l,int r,int c)

push_down(rt);

int mid=(segtree[rt].l+segtree[rt].r)>>1;

if(l>mid)

update(r(rt),l,r,c);

else if(r<=mid)

update(l(rt),l,r,c);

else

push_up(rt);

}int query(int rt,int len)

int main()

{ while(~scanf("%d%d",&n,&m)){

build(1,1,n);

while(m--){

int cmd,l,r;

scanf("%d",&cmd);

if(cmd == 1){

scanf("%d",&l);

if(segtree[1].len

POJ 3667 Hotel 線段樹區間合併

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

POJ 3667 hotel 線段樹區間合併

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

POJ 3667 Hotel (線段樹區間合併)

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