POJ 3667(線段樹區間合併)

2021-10-01 01:51:24 字數 1808 閱讀 6306

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 ...