1. 程式人生 > 其它 >高質量好題:AGC018D

高質量好題:AGC018D

...

Link

顯然每一條邊的最大貢獻為 \(w_{e} \times \min(siz_U,siz_V)\) ,其中 \(U,V\) 是邊 \(e\) 分割出來的兩顆子樹。

考慮到當以重心為根的時候(重心丟到最小的那顆子樹裡去),是可以卡到這個上界的。

構造方法為每次選擇重心 \(u\) 的兩個最大和次大的子樹來回跳躍。


證明:

  • 設子樹的 \(siz\) 序列為 \(x_{1},x_{2}\dots x_{n}\)
  • 當這個 \(x_{1}=x_{2}=\dots x_{n}\) 的時候可以直接反覆橫跳來構造。
  • \(x_{1}\) 是序列中最大值, \(x_{2}\) 是序列中最小值,它們的差值為 \(d\)
  • 每次選出最大值和次大值,讓它們都 \(-1\) ,依舊滿足 \(x_{1}<\sum^{n}_{i=2}x_{i}\)
  • 如果 \(x_{2}\) 成為了次大值,說明此時 \(x_{2}=x_{3}=\dots=x_{n}\) 或者\(x_{1}=x_{2}\) , 都是可以構造出來的。
  • 如果 \(x_{2}\) 不是次大值,那麼每一次 \(-1\) 都可以令差值 \(d-1\) ,同時又由於 \(x_{1}<\sum^{n}_{i=2}x_{i},x_{1}-x_{2}<\sum^{n}_{i=3}x_{i}\) ,經過若干次這種操作之後一定可以讓 \(d=0\)
  • 當然,這個過程中可能出現了最大值和次大值相同的情況,此時 \(-1\) 不一定會令 \(d-1\) ,但是也可以發現這樣會變成最大值和次大值之間互相對耗,直到出現了新的最大值為止,依舊滿足上述的這些性質,變成了一個子問題。

那麼計算每條邊的貢獻也就是 \(2\times w_{e}\times siz_{u}\)

但是考慮到最後的一條邊是無法被走兩次的,該去掉哪一條邊呢?

注意到,如果這棵樹不存在兩個重心,那麼一定可以構造出一種方案使得最後是從非重兒子那邊走回來,那麼減去的值就是與重心相連的最小的邊。否則,可以發現最後一定是從重兒子走回,那麼減去重心與重兒子之間的那條邊即可。

評測記錄