POJ 3667 線段樹,區間合併,成段更新

2021-06-14 07:40:45 字數 1276 閱讀 5770

比較經典的題目,題目中有兩種成段覆蓋的方式,因此在節點設定兩個標記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 ...