比較經典的題目,題目中有兩種成段覆蓋的方式,因此在節點設定兩個標記cover(房間清空),set(房間注滿)。
再每個節點設定乙個sum表示區間最長連續空房間。
然後設定lsum表示包括最左邊房間的最長連續空房間,rsum表示包括最右邊房間的最長連續空房間。
#include#include#include#include#includeusing namespace std;
#define lc l,m,index<<1
#define rc m+1,r,index<<1|1
#define n 50005
struct node
seg[n<<2];
int n,q;
void fcover(int l,int r,int index)
void fset(int l,int r,int index)
void pushup(int l,int r,int index)
void pushdown(int l,int r,int index)
if(father.set) }
void build(int l,int r,int index)
void updataset(int l,int r,int l,int r,int index)
pushdown(l,r,index);
int m=(l+r)>>1;
if(r<=m)updataset(l,r,lc);
else if(l>m)updataset(l,r,rc);
else
pushup(l,r,index);
}void updatacover(int l,int r,int l,int r,int index)
pushdown(l,r,index);
int m=(l+r)>>1;
if(r<=m)updatacover(l,r,lc);
else if(l>m)updatacover(l,r,rc);
else
pushup(l,r,index);
}int query(int id,int l,int r,int index)
int main()
{ int op,a,b;
while(scanf("%d%d",&n,&q)!=eof)
{ build(1,n,1);
while(q--)
{ scanf("%d%d",&op,&a);
if(op==1)
{if(seg[1].sum
poj3667 線段樹(區間合併)
題意 有編號為1 n的n個房間,有兩種詢問 1.有人來訂連續的k間房,有的話返回第一間房的編號,否則返回0。2.有人退連續的從a開始的連續的k間房。1.該區間最大的連續空房數 2.該區間從最左邊起的最大的連續空房數 3.該區間從最右邊起的最大的連續空房數 根據以上三個資訊,每個非葉結點的資訊都可以由...
poj 3667 線段樹 區間合併
感想 沒有什麼說的了。越做線段樹越感覺自己水。這個我感覺自己就真坑了大家了。難的不會,簡單的也水不過了。哎,最近這是什麼情況啊!題目 題意 旅館有編號為1 n的房間,現在可能有m波人過了租房,每波人可能要定連續的d間房,如果有的話,編號盡量小,沒有的話就說0,也可能有d個人要退房,他們的房是連續的x...
線段樹區間合併poj3667
題意 1 a表示如果有長度為a的連續的空房間,則占用 2 a b表示清空 a,a b 1 的房間 思路 線段樹區間維護,除了考慮區間上最大空房間,還要維護左邊最大連續和右邊最大連續 include include include include using namespace std define ...