線段樹合併

2022-05-14 14:12:24 字數 678 閱讀 6335

線段樹合併雖說是比較基礎的內容,且我一直都知道大概的實現方式,但直到最近我才正式去寫過一次,我真的太弱了啊。

下面從暴力合併開始,依次介紹幾種線段樹合併的方式。

直接暴力摳出線段樹中的元素,然後暴力合併。

總合併時間複雜度應為\(o(n^2logn)\)。

應該算是暴力合併的一種優化。

即,每次合併時選取較小的一棵線段樹,摳出其中元素插入另一棵線段樹中。

這也是如平衡樹等一些資料結構的常用合併方式。

總合併時間複雜度應為\(o(nlog^2n)\)。

這才是此文主要要介紹的線段樹合併。

考慮到線段樹的乙個基本性質,即對於下標範圍相同的兩棵線段樹,它們的形態是完全一樣的。

則,我們分別從根節點開始遍歷兩棵線段樹,對於當前位置分情況討論:

如果當前位置兩棵樹上都為空,直接返回。

如果當前位置是葉節點,直接合併資訊。

如果當前位置只有一棵樹上有節點,另一棵樹上為空,則令當前位置為前一棵樹上此位置的節點,然後返回(注意,這裡不再處理子樹,複雜度因此得以保證)。

如果當前位置兩棵樹上都有節點,則在此位置動態開點新建乙個節點,分別合併左兒子和右兒子,然後再從子節點上傳並更新資訊。

這一過程應該算是很簡單的吧,而其總合併時間複雜度為\(o(nlogn)\),十分優秀。

下面給出一道板子題:【bzoj5457】城市。

線段樹合併

做永無鄉的時候,以為是主席樹合併,後來感覺不對勁,唔。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有約會 雨天的尾巴 題目背景 深繪里一直很討厭雨天。灼熱...