倍增/線段樹維護樹的直徑 hdu5993/2016icpc青島L
阿新 • • 發佈:2018-09-19
就是 dfs max 進行 定義 獨立 假設 查詢 bsp
題意:
給一棵樹,每次詢問刪掉兩條邊,問剩下的三棵樹的最大直徑
點10W,詢問10W,詢問相互獨立
Solution:
考慮線段樹/倍增維護數的直徑
考慮dfs序的一個區間 [l, r] 是聯通的
而我們知道了有 l <= k < r,
且知道 [l, k] 和 [k + 1, r] 兩個區間的直徑端點及長度
假設兩個區間的直徑端點分別為 (l1, r1) 和 (l2, r2)
那麽 [l, r] 這個區間的直徑長度為
dis(l1, r1) dis(l1, l1) dis(l1, r2)
dis(r1, l2) dis(r1, r2) dis(l2, r2)
六個值中的最大值
證明:
假設兩個區間是通過邊 (u, v) 聯通的
且點 u 屬於前一個區間,點 v 屬於後一個區間
1) 如果新區間的直徑不經過這條邊
那麽新區間直徑就是 max(dis(l1, r1), dis(l2, r2))
2) 新區間的直徑經過這條邊
考慮 v 到後一個區間的點的最長距離
一定是到 l2 和 r2 兩個點其中一個點的距離(樹的直徑的定義)
u 到前一個區間的點的最長距離同理
所以枚舉四種情況即可
一個問題:
倍增/線段樹維護的過程中,某個區間可能並不是聯通的
那麽繼續進行上面的合並還能保證正確意義嗎?
我們只要保證查詢的區間是聯通的,那麽在這個區間查詢的意義下
包含的每個區間都是有意義的,因為兩個不連通的區間的LCA一定在查詢區間裏
這樣合並的正確意義也就有保證了
倍增/線段樹維護樹的直徑 hdu5993/2016icpc青島L