這個演算法借助線段樹,然後事實上是通過遍歷線段樹進行分治。
先用一種比較容易的方式來解釋吧。
先回憶天天愛跑步一類的題目,大致就是在一棵樹上通過dfs,訪問到這個點的時候把這個點上的操作加入貢獻,離開的時候除去貢獻,然後就可以了。當我們發現乙個操作不能只用乙個點來表示,也即,兩個操作有交卻又不完全包含,就把兩個操作有相交的屬性(通常是時間)作為線段樹的索引物件,然後把每個操作拆分成 \(log\) 個操作,然後就可以套用前面說的方法了(當然維護方法有所不同)。
地理課上,老師給出了乙個巨大的地圖,由於世界日新月異,會有一些道路在某一時刻被刪除,也會有一些道路在某一時刻被修建。這裡的道路均為雙向的。老師認為,有一些城市被分在了乙個連通塊中可以相互到達,而有一些城市不能夠相互到達。而他想知道,每個時刻所有連通塊大小的乘積是多少?小a看到這個地圖的時候就蒙了,還好那只上天的喵及時幫助了他。現在他把這個清真的地圖拿過來給你,想試試看你能不能求出來。由於答案可能很大,輸出乘積 \(\mod 10^9+7\) 即可。
\(n,m\leq 100000\) ,保證無重邊、自環。
顯然,先按照之前的部分把每個詢問放到樹上,然後對整棵線段樹做一次dfs,然後用可撤銷並查集維護一下,就能得到答案。
詳見:bzoj4025和bzoj3237。
線段樹分治
動態圖聯通性 可離線 loj121 給你一張無向圖,你要支援如下操作 1 刪除一條邊 2 加入一條邊 3 查詢某兩個點對間是否聯通 離線做法 線段樹分治 口胡做法 把操作的順序當做時間。每條邊維護乙個存活區間,代表這條邊在這個時間區間裡面活著。對時間軸建立一顆線段樹,從線段樹根開始dfs。進入乙個子...
線段樹分治
首先,這裡的線段樹是狹義的線段樹。而線段樹分治是一種維護時間區間的資料結構,利用線段樹的分治性使時間複雜度為log loglo g級別。維護時間區間的資料結構有cdq分治 kd tree,那麼線段樹分治和它們的區別在 呢?其實,它就是用回退操作來實現可持久化,或者說是維護了操作會影響的時間區間。我們...
線段樹分治
day2模擬被完爆了w 來學一波線段樹分治 原來一直拿它口胡其實沒寫過。然鵝這個東西和線段樹的關係 就像點分治和點分樹一樣 並不用建出來 但遍歷順序是一致的 從上到下 從左兒子到右兒子 訪問 線段樹 的所有節點 每個節點表示乙個區間 當然維護的也是區間裡的值 這就要求我們維護的東西滿足區間加法 比如...