線段樹進階 學習筆記

蒟蒻OIer發表於2024-06-23

線段樹合併 學習筆記

線段樹分治

P5787

考慮怎麼判斷二分圖。先考慮弱化的版本。

  • 不考慮刪邊加邊,則可以直接黑白染色。
  • 考慮只加邊,不刪邊,分類討論:
    • 注意到對於同一個連通塊,一共只有兩種染色方式。
    • 加的邊在兩個連通塊之間,一定是 Yes,並確定了兩個連通塊的染色方案。
    • 加的邊在連通塊內,直接判斷。
    • 這樣單次複雜度就都是 \(O(1)\) 的了。

但是刪邊怎麼辦呢?

如果插入是好插入的,刪除是難刪除的,這樣的題目就可以考慮線段樹分治

我們發現,一張圖不是二分圖,當且僅當其存在奇環。否則可以透過一棵生成樹染色。

於是考慮把圖拆成兩層,每條邊 \((u,v)\) 拆成 \((u,v')\)\((u',v)\)。這樣一個點 \(u\) 能走若干步到達 \(u'\) 的,然後就可以用並查集判斷奇環了。(?)

於是有一個暴力的方法:每次建新圖,然後把有的邊加進去。接著畫圖上樹。

注意到原來我們是想每個時刻繼承其上一個時刻的圖,這樣就不可避免的需要刪除;但是我們可以繼承其父親的圖,這樣就不用刪除了。

但是我們同時只能維護一個並查集,怎麼辦呢?

我們只能考慮回溯時對並查集進行撤銷。但是……路徑壓縮並查集的複雜度是勢能分析來保證的,因此它不能可持久化。於是我們只能把目光移到按秩合併上來。按秩合併的思想和 DSU on Tree 的思想有點像,每次合併時把深度小的合併到深度大的。

相關文章