線段樹區間合併poj3667

2021-06-21 20:07:29 字數 1581 閱讀 5651

題意:1 a表示如果有長度為a的連續的空房間,則占用

2 a b表示清空[a,a+b-1]的房間

思路:線段樹區間維護,除了考慮區間上最大空房間,還要維護左邊最大連續和右邊最大連續

#include #include #include #include using namespace std;

#define lson l , m , rt << 1

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

const int maxn = 55555;

int lsum[maxn<<2] , rsum[maxn<<2] , msum[maxn<<2];

int cover[maxn<<2];

void pushdown(int rt,int m)

}void pushup(int rt,int m)

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

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

pushdown(rt , r - l + 1);

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

if (l <= m) update(l , r , c , lson);

if (m < r) update(l , r , c , rson);

pushup(rt , r - l + 1);

}int query(int w,int l,int r,int rt)

int main()

} else

} return 0;

}

自己的:

#include#include#include#includeusing namespace std;

const int maxn=50010;

int n,m;

int ans;

struct intevaltree

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

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

}void update(int o,int l,int r,int q1,int q2,int flag)

maintain(o,l,r);

}int query(int o,int l,int r,int x)

}tree;

int main()

{ //freopen("in.txt","r",stdin);

int a,b,op;

scanf("%d%d",&n,&m);

tree.build(1,1,n);

while(m--)

{scanf("%d",&op);

if(op==1)

{scanf("%d",&a);

if(tree.sum[1]

poj3667 線段樹(區間合併)

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

poj 3667 線段樹 區間合併

感想 沒有什麼說的了。越做線段樹越感覺自己水。這個我感覺自己就真坑了大家了。難的不會,簡單的也水不過了。哎,最近這是什麼情況啊!題目 題意 旅館有編號為1 n的房間,現在可能有m波人過了租房,每波人可能要定連續的d間房,如果有的話,編號盡量小,沒有的話就說0,也可能有d個人要退房,他們的房是連續的x...

poj3667 線段樹區間合併)

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