1. 程式人生 > >Atcoder AGC008F : Black Radius(DP)

Atcoder AGC008F : Black Radius(DP)

傳送門

題解:
定義二元組 (x,d) 為一個選擇 x 為關鍵點,d 為最大距離的染色方案。
先考慮全為黑色點的做法:
我們設 f(x,d) 表示與 x 距離不超過 d 的點的集合。不妨假設 f(x,d) 不是全集,這樣答案就是所有本質不同的集合 f(x,d) 個數再加上 1(因為全集總是一種合法的染色方案)。
如果對於每個 x 直接求出有多少 d 的取值並累加顯然是不對的,因為這樣會有本質相同的方案被重複計算。
我們考慮對於每個點對 (i,j),染色方案 (i,d1)(j,d2) 何時會重複:設

S=f(i,d1)=f(j,d2),那麼對於任意ij 路徑上的節點 k 均滿足 f(x,d1dist(i,k))=S,其中dist(i,k) 表示 i 在樹上與 k 的距離。故我們找到路徑上最接近 i 的節點(即與 i 相鄰)的節點k,只需要關心這些節點即可。
我們試圖計算有多少 d 滿足 f(i,d) 不與任何 f(j,d2) 重複,據題意得:
1、f(i,d) 不為全集。
2、對於任意與 i 相鄰的 kf(i,d)f(k,d1)
第1種條件的解決方法很簡單,我們對於每個節點i 求出 i 到樹上最遠節點的距離 disi ,那麼 d[0,disi1]
第2種條件可以等價於方案 (i,d) 中以 i 為根的樹除了 k 所在子樹中的節點之外均被染黑而方案 (k,d1) 中這些節點也同樣被染黑,那麼我們對於每條邊 (i,k) 求出從 i 出發不經過 k 到樹上最遠節點的距離 dis2(i,k),則 d[0,dis2i,k+1]
disi