qoj9230 Routing K-Codes 題解

Creeper_l發表於2024-10-05

首先這個圖肯定不能有環,也不能有度數大於 \(3\) 的點。

也就是說這是一顆二叉樹。我們假設父親都比兒子小,根節點的值最小。

那麼假設 \(u\) 點的值為 \(x\),它的兒子的值一定是 \(\{2x,2x+1\}\) 的子集。會發現 \(u\) 的子樹內的權值和是一個關於 \(x\) 的一次函式。而且無論兩個兒子中哪個取 \(2x\),哪個取 \(2x+1\),這個函式的斜率 \(k\) 都是不變的,影響的只是常數 \(b\) 的值。(這個可以手推驗證一下)。於是我們就可以 dp 了。

\(dp_u=(k,b)\) 表示當 \(u\) 的值為 \(x\) 時,子樹內的權值和最少為 \(kx+b\)\(k\) 一定,其實最小化的是 \(b\))。轉移很簡單,分類討論哪個兒子為 \(2x\),哪個為 \(2x+1\) 即可。然後換根一下就可以求出以每個點為根時的 dp 值了。

\(u\) 為根時,如果 \(u\) 的度數為 \(1\),那麼 \(x=0\)。否則 \(x=1\)。再帶入 \(k,b\) 就可以計算答案了。

需要注意 \(x < 2^{32}\),也就是深度不能超過 \(32\),需要判一下。

相關文章