感想:
沒有什麼說的了。。。。。越做線段樹越感覺自己水。。。。。。。。這個我感覺自己就真坑了大家了。。。。。。。難的不會,簡單的也水不過了。。。。。哎,最近這是什麼情況啊!!!
/*
題目:題意:旅館有編號為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 ...