1. 程式人生 > >【LOJ2262】「CTSC2017」網路

【LOJ2262】「CTSC2017」網路

【題目連結】

【思路要點】

  • 首先,本題一點重要的觀察是,新建的路徑的兩個端點必定在樹的直徑上,若一個方案新建路徑的兩個端點有一個不在直徑上,我們令其向直徑靠近,不會使答案變劣。
  • 因此,我們可以將直徑拿出來考慮,令直徑上點數為 t o t
    tot
    ,每一個點為 p o s i pos_i
    p o s i pos_i p
    o s i 1 pos_{i-1}
    在樹上的連邊長度為 l e n i len_i p r e i = j = 1 i l e n j pre_i=\sum_{j=1}^{i}len_j
  • 如果我們切斷直徑上所有的邊,樹會分成 t o t tot 塊,每一塊的直徑是無可避免的,令 L L 為每一塊直徑的最大值,則答案至少為 L L ,至多為直徑長度 R R 。令 d o w n i down_i 為從 p o s i pos_i 出發在第 i i 塊內的最長路徑的長度。
  • 有了答案的區間 [ L , R ] [L,R] ,考慮二分答案 m i d mid ,判斷是否存在使得所有距離不超過 m i d mid 的連邊方案。
  • 假設我們最終的連邊為 a b   ( a < b ) a\rightarrow b\ (a<b) ,那麼對於任意一對 i < j i<j ,以下兩點至少有一點成立是存在方案的充要條件:
    1 1 d o w n i + d o w n j + p r e j p r e i m i d down_i+down_j+pre_j-pre_i≤mid
    2 2 d o w n i + d o w n j + p r e i p r e a + p r e j p r e b + L e n m i d down_i+down_j+|pre_i-pre_a|+|pre_j-pre_b|+Len≤mid ,其中 L e n Len 為新增的邊長
  • 由於要求是 m i d ≤mid ,我們可以列舉 2 2 式中的兩個絕對值的展開方式,將其轉化為 4 4 個不帶絕對值的限制。
  • p o s i pos_i 分別按照 d o w n i + p r e i , d o w n i p r e i down_i+pre_i,down_i-pre_i 排序,在第一個順序中列舉 j j ,對應滿足 1 1 式的 i i 應當是第二個順序的一個字首,忽略掉滿足 1 1 式的 ( i , j ) (i,j) ,對於剩餘的一定要滿足 2 2 式的 ( i , j ) (i,j) ,我們分別求出出現過最緊的限制 l i m i t 1 , l i m i t 2 , l i m i t 3 , l i m i t 4 limit_1,limit_2,limit_3,limit_4
  • 接下來問題轉化為了判斷是否存在 ( a , b ) (a,b) ,滿足
    1 1 p r e a p r e b l i m i t 1 -pre_a-pre_b≤limit_1
    2 2 p r e a + p r e b l i m i t 2 -pre_a+pre_b≤limit_2