目錄寫在最後
某培訓機構某天的考試題出現了板子= =
於是簡單寫下。
有這樣的一種模型:
給定一些僅在給定時間範圍內有效的操作。
詢問某個時間點所有操作的貢獻。
考慮離線操作,對時間軸建立線段樹,將每個操作轉化為線段樹上的區間標記操作。
查詢時遍歷整棵線段樹,到達每個節點時執行相應的操作,到達葉節點統計貢獻,回溯時撤銷操作的影響
原題面:luogu
darkbzoj
給定 \(n\) 個節點,有 \(m\) 條出現一段時間後後消失的邊,第 \(i\) 條邊 \((x_i,y_i)\) 的存在時間為 \([l_i,r_i]\)。先考慮所有 \(r_i = k\) 的情況,即僅有加邊操作,所有的邊出現後不消失。給定引數 \(k\),判斷 \(1\sim k\) 內每個時刻時,整個圖是不是二分圖。
\(n,k = 10^5\),\(m=2\times 10^5\),\(1\le u_i,v_i\le n\),\(0\le l\le r\le k\)。
判斷二分圖,想到這個題:p1525 關押罪犯
考慮使用擴充套件域並查集進行維護。
具體地,將點 \(i\) 拆成點 \(i\) 和 \(i+n\),分別表示在同一獨立集,與不在同一獨立集。
對於一條邊 \((x_i,y_i)\),將 \(x_i\) 與 \(y_i+n\) 合併,\(x_i+n\) 與 \(y_i\) 合併。
在加入一條邊 \((x_i,y_i)\) 之前,若發現 \(x_i,y_i\) 在同一並查集中,則加入該邊後相當於出現乙個奇環,破壞了二分圖的結構,之後再加任意數量的邊都不為二分圖。
再考慮消失的限制,並找不到什麼可簡單維護的方式。
考慮線段樹分治,對時間軸建立線段樹。
維護區間內存在的邊集,用 vector 進行維護。
查詢時從根節點出發開始遍歷,遞迴處理時將當前節點存在的邊進行合併,判斷是否為二分圖。
若到達某個點是不為二分圖,則該點維護的時間區間內原圖均不為二分圖。
到達葉節點時,若仍為二分圖,輸出 yes。
回溯時,發現並查集並不支援刪除操作。
考慮使用乙個棧記錄下對並查集的操作,將父子關係再改回去。
則不可使用路徑壓縮,否則操作次數**,為保證複雜度,應進行按秩合併。
注意擴充套件域並查集對空間的需求。
總複雜度 \(o(m\log n\log k)\)。
**:p5787 二分圖 /【模板】線段樹分治。
給定 \(n\) 個節點,初始時圖中沒有邊。有 \(m\) 次操作:感覺這個比上面的還板子= =加入一條不存在的邊。
刪除一條存在的邊。
查詢給定點對是否連通。
\(1\le n\le 5000\),\(1\le m\le 5\times 10^5\)。
大致思路同上,使用可撤銷並查集維護連通性即可。
深入到葉節點時回答對應時刻的詢問。
複雜度 \(o(m\log m\log n)\)。
**:loj 121. 「離線可過」動態圖連通性。
參考:題解 p5787 【二分圖 _【模板】線段樹分治】 - xht37 的洛谷部落格
學習筆記 線段樹分治
線段樹分治是一種離線分治演算法,主要思想是建立以詢問的時間為葉節點的線段樹,考慮修改對詢問的影響 修改會影響一段時間上的詢問 用類似標記永久化的思想進行區間修改 即把原修改影響的區間 l,r 分成最多 log r l 1 段,將操作掛在對應的節點上,不上傳也不用下傳 最後 dfs 一遍,每進入乙個節...
線段樹分治
動態圖聯通性 可離線 loj121 給你一張無向圖,你要支援如下操作 1 刪除一條邊 2 加入一條邊 3 查詢某兩個點對間是否聯通 離線做法 線段樹分治 口胡做法 把操作的順序當做時間。每條邊維護乙個存活區間,代表這條邊在這個時間區間裡面活著。對時間軸建立一顆線段樹,從線段樹根開始dfs。進入乙個子...
線段樹分治
首先,這裡的線段樹是狹義的線段樹。而線段樹分治是一種維護時間區間的資料結構,利用線段樹的分治性使時間複雜度為log loglo g級別。維護時間區間的資料結構有cdq分治 kd tree,那麼線段樹分治和它們的區別在 呢?其實,它就是用回退操作來實現可持久化,或者說是維護了操作會影響的時間區間。我們...