題意
乙個旅館有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...