poj 3667 線段樹 區間合併

2021-06-10 05:38:21 字數 1434 閱讀 7766

感想:

沒有什麼說的了。。。。。越做線段樹越感覺自己水。。。。。。。。這個我感覺自己就真坑了大家了。。。。。。。難的不會,簡單的也水不過了。。。。。哎,最近這是什麼情況啊!!!

/*

題目:題意:旅館有編號為1~n的房間,現在可能有m波人過了租房,

每波人可能要定連續的d間房,如果有的話,編號盡量小,沒有的話就說0,

也可能有d個人要退房,他們的房是連續的x~x+d-1這幾間。。。

分析:這題屬於線段樹區間合併,還是比較簡單的。。。

首先,當然要記錄乙個區間最長的連續值了,這個方便取值,

然後要考慮乙個區間如何從它的兩子區間轉移過來,這個最長的值肯定可以使連個值區間最長值的大者,

當然,兩子區間合併,可能得到更長的,而這個更長的肯定在中間,

我們需要記錄左子區間從右端開始到左端的最長連續值,記錄右子區間從左端到右端的最長連續值,

新的值就是這兩個值相加了,當然,由於不確定哪個區間是左區間,所以每個區間都要記錄這三個值

*/#include#include#include#includeusing namespace std;

const int maxn=50002;

#define lson rt<<1,l,mid

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

int col[maxn<<2],lmax[maxn<<2],rmax[maxn<<2],mmax[maxn<<2],q,n,m;

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

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

else

col[rt]=-1;

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

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

build(lson);

build(rson);

//pushup(rt,l,r);

}void updata(int rt,int l,int r,int l,int r,int val)

pushdown(rt,l,r);

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

if(mid>=l) updata(lson,l,r,val);

if(mid=sum) return l;

pushdown(rt,l,r);

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

if(mmax[rt<<1]>=sum)return query(lson,sum);

if(rmax[rt<<1]+lmax[rt<<1|1]>=sum) return mid-rmax[rt<<1]+1;

return query(rson,sum);

}int main()

else}}

return 0;

}

poj3667 線段樹(區間合併)

題意 有編號為1 n的n個房間,有兩種詢問 1.有人來訂連續的k間房,有的話返回第一間房的編號,否則返回0。2.有人退連續的從a開始的連續的k間房。1.該區間最大的連續空房數 2.該區間從最左邊起的最大的連續空房數 3.該區間從最右邊起的最大的連續空房數 根據以上三個資訊,每個非葉結點的資訊都可以由...

線段樹區間合併poj3667

題意 1 a表示如果有長度為a的連續的空房間,則占用 2 a b表示清空 a,a b 1 的房間 思路 線段樹區間維護,除了考慮區間上最大空房間,還要維護左邊最大連續和右邊最大連續 include include include include using namespace std define ...

poj3667 線段樹區間合併)

思路 線段樹的區間合併,lm表示該區間從左邊開始最大的空區間,mm表示該區間最大的空區間,rm表示從右邊數最大的空區間 注意向下更新 include includeusing namespace std const int n 50005 struct node d n 3 int max int ...