poj 3667 最長空白段 查詢最左連續段

2021-06-26 08:44:16 字數 2006 閱讀 9312

題意:從最左找連續空間,是否能找到。

解法:同poj1823。

//是1823的加強版,但是提交記錄也是呵呵了。

//多的乙個操作就是查詢操作了。

更新操作同poj1823

查詢操作:

1. 先判斷是都存在

2. 如果存在,左兒子中有就遞迴找左兒子

3. 如果左兒子的有連續+有兒子的左連續空間有,那就返回位置

4. 否則,遞迴尋找右兒子

//線段樹真是奇妙,很多更新、查詢操作都很巧妙

#include

#include

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include 

#include 

#define maxn 201000+5

#define inf 0x3f3f3f3f

#define inf 0x3fffffffffffffffll

#define rep(i,n) for(i=0;i#define rep(i,n) for(i=1;i<=n;i++)

#define ull unsigned long long

#define ll long long

#define ll(x) x<<1

#define rr(x) x<<1|1

#define cle(a) memset(a,0,sizeof(a))

using namespace std; 

struct node 

void init() 

}tree[maxn*4]; 

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

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

if(tree[rt].flag!=-1) 

int mid=tree[rt].mid(); 

if(r<=mid)update(ll(rt),l,r,flag); 

else

if(l>mid)update(rr(rt),l,r,flag); 

else  

if(tree[ll(rt)].lsum==tree[ll(rt)].r-tree[ll(rt)].l+1)tree[rt].lsum=tree[ll(rt)].lsum+tree[rr(rt)].lsum;  

else tree[rt].lsum=tree[ll(rt)].lsum;  

if(tree[rr(rt)].rsum==tree[rr(rt)].r-tree[rr(rt)].l+1)tree[rt].rsum=tree[ll(rt)].rsum+tree[rr(rt)].rsum;  

else tree[rt].rsum=tree[rr(rt)].rsum;  

tree[rt].msum=max(max(tree[ll(rt)].msum,tree[rr(rt)].msum),tree[ll(rt)].rsum+tree[rr(rt)].lsum);  

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

int mid=tree[rt].mid(); 

if(tree[ll(rt)].msum>=w) return query(ll(rt),l,mid,w); 

else

if(tree[ll(rt)].rsum+tree[rr(rt)].lsum>=w)return mid-tree[ll(rt)].rsum+1; 

else

return query(rr(rt),mid+1,r,w); 

} int main()  } 

else 

} } 

return

0; }

線段樹重開poj 3667

本題目重做感受頗多,思考的深度決定了對線段樹的掌握程度,只有自己創生的才是自己的啊。本題用到了三個維護值,sum表示區間最長連續區間,lsum為區間左面最長連續區間長。rsum同理。現在來說明sum為什麼具有 可維護性,線段樹的可維護性是相對於更新區間而言的,因為更新的logn個區間總是被刷成全空房...

POJ 3667 線段樹 標記

自從某次考試寫線段樹寫掛了以後 這是第一次寫線段樹,這是乙個傷心的故事 題意 思路 標記 維護從左到右的最大值 從右到左的最大值 區間內的最大值 然後就一搞 就出來了 by siriusren include using namespace std int n,m,jy,xx,yy,d,d stru...

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

比較經典的題目,題目中有兩種成段覆蓋的方式,因此在節點設定兩個標記cover 房間清空 set 房間注滿 再每個節點設定乙個sum表示區間最長連續空房間。然後設定lsum表示包括最左邊房間的最長連續空房間,rsum表示包括最右邊房間的最長連續空房間。include include include i...