一開始還以為線段樹合併是什麼高階操作。
學完後發現其實蠻簡單的。
線段樹合併,就是把兩棵線段樹的資訊整合到一棵線段樹上,只要動態開點遞迴處理就好了,如圖:
上面這張圖展示的就是把左邊兩棵線段樹合併成右邊那棵藍色線段樹的過程,還是很好理解的。
下面就是沒有那麼偽的線段樹合併偽**:
//不難看出,線段樹合併的複雜度就是兩棵線段樹重合的節點的個數。[l,r]為當前所處理的區間
//x為第一棵線段樹當前節點的編號
//y為第二棵線段樹當前節點的編號
function node merge_trees(int l,int r,int x,int
y)
if(l==r) //
如果處理到了區間中只剩乙個數了
int mid = (l + r) / 2 , t = make_new_node(); //
求中點、新建節點
t->lson = merge_trees(l,mid,x->lson,y->lson); //
遞迴處理左兒子
t->rson = merge_trees(mid + 1,r,x->rson,y->rson); //
遞迴處理右兒子
t->val = t->lson->val + t->rson->val; //
資訊上傳
return t; //
記得要返回當前節點
}
理解一下就好了。
例題:bzoj p2212 [poi2011]tree rotations。
題解在這裡。
參考文章在這裡。
線段樹合併
做永無鄉的時候,以為是主席樹合併,後來感覺不對勁,唔。x和y是兩顆樹的根。這個演算法是從歸併演算法那引申的。實際運作的時候,考慮到了線段樹的本質 線段樹有效節點就是葉子節點。好像是句廢話。其實不是,這句話啟發我們並不需要合併一整棵樹,我們只需要處理好葉子節點,考慮把y樹合併到x上,那麼把y樹的葉子節...
線段樹合併
今天寫dsu on tree 的時候發現不會寫線段樹合併,於是滾來寫線段樹合併部落格 對於值域相同的兩個權值線段樹x xx和y yy 假設把y yy合併到x xx上 每個節點有兩種情況 其中至少有乙個節點沒有權值 x y x y x y 直接x x y x x y x x y x 0?y x x 0...
線段樹合併
某一天馬學長給我看了乙個lca的題目,然而確實是lca 樹上差分,但是僅僅有lca和樹上差分解決不了,然後我就去面向題解程式設計了。可是這個線段樹合併是個什麼東東。然而今天看書,突然看到了這個線段樹合併。就寫一下了。mmh。p4556 vani有約會 雨天的尾巴 題目背景 深繪里一直很討厭雨天。灼熱...