線段樹分治

2021-10-06 03:41:07 字數 725 閱讀 3920

首先,這裡的線段樹是狹義的線段樹。

而線段樹分治是一種維護時間區間的資料結構,利用線段樹的分治性使時間複雜度為log

loglo

g級別。

維護時間區間的資料結構有cdq分治、kd-tree,那麼線段樹分治和它們的區別在**呢?其實,它就是用回退操作來實現可持久化,或者說是維護了操作會影響的時間區間。

我們考慮如何得到這個操作影響的時間區間。假設乙個操作會影響的時間區間為[l,

r]

[l,r]

[l,r

],轉移分散到線段樹上是log

loglo

g

qq個操作,計算q′q'

q′個操作影響的時間複雜度為f(q

′)

f(q')

f(q′

),那麼一次詢問的時間複雜度為o(f

(q))

o(f(q))

o(f(q)

)。這樣似乎是過不了的。我們進行優化:將查詢操作也插入線段樹中,每一次遞迴整棵線段樹。對於節點直接計算影響,同時改變在這個節點上的的詢問的答案。如此複雜度變為o(∑

f(i)

)=o(

f(nl

ogn)

)o(\sum f(i))=o(f(nlogn))

o(∑f(i

))=o

(f(n

logn

))這樣說似乎不容易懂(其實我也沒懂)。還是用例題學習法吧。

線段樹分治

動態圖聯通性 可離線 loj121 給你一張無向圖,你要支援如下操作 1 刪除一條邊 2 加入一條邊 3 查詢某兩個點對間是否聯通 離線做法 線段樹分治 口胡做法 把操作的順序當做時間。每條邊維護乙個存活區間,代表這條邊在這個時間區間裡面活著。對時間軸建立一顆線段樹,從線段樹根開始dfs。進入乙個子...

線段樹分治

day2模擬被完爆了w 來學一波線段樹分治 原來一直拿它口胡其實沒寫過。然鵝這個東西和線段樹的關係 就像點分治和點分樹一樣 並不用建出來 但遍歷順序是一致的 從上到下 從左兒子到右兒子 訪問 線段樹 的所有節點 每個節點表示乙個區間 當然維護的也是區間裡的值 這就要求我們維護的東西滿足區間加法 比如...

線段樹分治

這個演算法借助線段樹,然後事實上是通過遍歷線段樹進行分治。先用一種比較容易的方式來解釋吧。先回憶天天愛跑步一類的題目,大致就是在一棵樹上通過dfs,訪問到這個點的時候把這個點上的操作加入貢獻,離開的時候除去貢獻,然後就可以了。當我們發現乙個操作不能只用乙個點來表示,也即,兩個操作有交卻又不完全包含,...