1. 程式人生 > >5874. 【NOIP2018提高組模擬9.18】小p的決心(倍增LCA 離線 或 線上)

5874. 【NOIP2018提高組模擬9.18】小p的決心(倍增LCA 離線 或 線上)

Problem

  • 維護一個至多 n n 節點的森林, Q Q 個操作,支援連邊和查詢兩點 L
    C A LCA
    .

Data constraint

  • 1 N
    100000 1 Q 100000 1\le N\le 100000,1\le Q\le 100000

Solution

1. 離線做法
  • 首先考慮比較簡單的離線做法.

  • 我們可以考慮先把最終的森林給構出來.

  • 再每棵樹上任意找一點 R t Rt 作為原始根,然後求個倍增陣列.

  • 然後掃一遍詢問,並查集維護到每一個詢問操作時,兩個點 u , v u,v 所在的樹的真正根 r o o t root .

  • 那麼答案其實就是擁有 l , r , r o o t l,r,root 兩兩 L C A LCA 的最大深度的那個點.

  • 具體證明可以分類討論,這是一種很經典的套路.

  • 其實這種套路在5783. 【省選模擬2018.8.8】樹 這道題裡也出現了,當時我亂搞搞出來了,但這一次卻沒有想到.

2.線上做法
  • 為了使自己印象更深刻一些,下次遇到這種求LCA的題目能更靈活變通,我還打了一下線上做法.

  • 不難發現離線做法的時間複雜度實際上就是找 L C A LCA 的時間複雜度,這個可以在 O ( n l o g n ) O(nlogn) 時間內做到.

  • 但如果強制線上,我們需要怎樣做呢?

  • 很容易想到的是啟發式合併倍增陣列.

  • 但問題是合併後很有可能根會發生改變,也就是倍增的根與當前真正的根不一樣.

  • 顯然,這就是上面離線所說的,需要做的3次LCA.

  • 時間複雜度近似 O ( n l o g 2 n ) O(nlog^2n) ,實際上遠遠比這小.