線段樹區間更新 poj 1823

2021-09-02 08:55:51 字數 1027 閱讀 6346

題意

乙個旅館有n個房間,有m次操作,每次操作可以是 1,從第a個房間開始的連續b個房間全部住滿 2:從a開始的b個房間全部清空 3:查詢n個房間中最長連續空房間的長度。

思路對於每個節點,記錄這個節點的sta:狀態,val:最長連續空房 lmx:區間內左側連續空房間數 rmx:區間內右側連續空房間數。並用子節點的值來更新父節點。

更新節點時,記得用子節點的狀態更新當前節點的sta值,否則父節點更新時會出錯。

#include#include#includeusing namespace std;

const int nmax = 1000000;

structnode[3*nmax];

void gao(int u)else

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

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

build(l ,m ,u*2);

build(m+1 ,r ,u*2 + 1);

}void update(int left ,int right ,int ope ,int u)

if(node[u].sta == ope)return ;

if(node[u].sta != -1)

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

if(right <= m)elseelse

}if(node[u*2].sta == 0)else

if(node[u*2+1].sta == 0)else

node[u].val = max(node[u*2].val,node[u*2+1].val);

node[u].val = max(node[u].val,node[u*2].rmx+node[u*2+1].lmx);

if(node[u*2].sta == node[u*2+1].sta)

}int main()

if(ope == 2)

if(ope == 3)}}

return 0;

}

線段樹的懶操作 POJ1823

本來以為把伸展樹看懂了,結果分析題目的時候,且不說自己做了,別人的 都讀不懂!看到伸展樹操作中也有懶操作的身影,就重新回到基礎,學習了一下線段樹的懶操作問題!半天時間就這樣過去了!不過還好的是勉強ac了這道題!這道題是一道線段樹很基礎的題 更新區間,查詢區間!題目大意是給定乙個區間,0表示空閒,1表...

線段樹的懶操作 POJ1823

本來以為把伸展樹看懂了,結果分析題目的時候,且不說自己做了,別人的 都讀不懂!看到伸展樹操作中也有懶操作的身影,就重新回到基礎,學習了一下線段樹的懶操作問題!半天時間就這樣過去了!不過還好的是勉強ac了這道題!這道題是一道線段樹很基礎的題 更新區間,查詢區間!題目大意是給定乙個區間,0表示空閒,1表...

POJ 2991 線段樹區間更新

每個葉子節點儲存每個線段的向量。那麼答案就是線段樹區間和。每次操作就是對向量進行旋轉,線段樹的區間更新加上向量旋轉公式搞定。設有向量 x0,y0 逆時針旋轉a度後的向量為 x1,y1 有 x1 x0 cos a y0 sin a y1 x0 sin a y0 cos a include includ...