1. 程式人生 > >倍增/線段樹維護樹的直徑 hdu5993/2016icpc青島L

倍增/線段樹維護樹的直徑 hdu5993/2016icpc青島L

就是 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