poj3667
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
const
int maxn=
50005
;struct nodetree[maxn<<2]
;void
build
(int m,
int l,
int r)
build
(m<<
1,l,mid)
;build
(m<<1|
1,mid+
1,r);}
void
pushdown
(int m)
else
tree[m]
.cov=-1
;}void
pushup
(int m,
int l,
int r)
intquery
(int m,
int l,
int r,
int p)
pushdown
(m);
//如果當前還沒查詢到所要的區間,就要及時pushdown,因為這樣會節約一些不必要的操作
//只有該區間的cov值為0或則為1時,才會向左右子區間下壓,
int mid=
(l+r)
>>1;
if(tree[m<<1]
.sum>=p)
return
query
(m<<
1,l,mid,p)
;else
if(tree[m<<1]
.rsum+tree[m<<1|
1].lsum>=p)
return mid-tree[m<<1]
.rsum+1;
else
return
query
(m<<1|
1,mid+
1,r,p);}
void
update
(int m,
int l,
int r,
int p)
else
return;}
pushdown
(m);
//更新時也不要忘記向下pushdown
int mid=
(tree[m]
.l+tree[m]
.r)>>1;
if(l<=mid)
update
(m<<
1,l,r,p);if
(r>mid)
update
(m<<1|
1,l,r,p)
;pushup
(m,tree[m]
.l,tree[m]
.r);
//向上更新父節點區間的lsum,sum,rsum,但不能對父節點的cov值進行操作
}//因為你不能保證左右子節點區間的cov的值相同且不為-1
int n,m;
intmain()
*/int op;
scanf
("%d"
,&op);if
(op==1)
else
}else
//printf("okkkk\n");}}
return0;
}
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 ...