题解:CF1280D Miss Punyverse
题目本质是在一棵含 \(n\le3000\) 个节点的树上切下恰好 \(m\) 个连通块,使黄蜂在其中赢的块数尽量多。对每个节点记黄蜂数 \(w_i\)、蜜蜂数 \(b_i\),把差值 \(\Delta_i=w_i-b_i\) 视为权重,则某连通块的总差 \(\sum\Delta>0\) 当且仅当黄蜂赢。整个问题就转化成经典的最大化正权子块数的树形背包。
设 \(dp_u[k]\) 表示以 \(u\) 为根、当前与父节点仍连通的那一块保留 \(k\) 个结点块(即总块数为 \(k\))时的最优状态,用二元组 \((win, diff)\) 存:已确定赢的块数 \(win\) 与当前连在父边的块差值 \(diff\)。对子树合并时有两种选择:一是不切儿子块,块数相加后减一,差值直接累加;二是切开儿子根边,块数相加,额外增加 \(\bigl(diff_{child}>0\bigr)\) 的赢块,并把儿子块差值锁定不再合并。两种情况都尝试后取字典序最大的 \((win,diff)\)。整棵树递归后根节点的答案是 \(dp_1[m].win+(dp_1[m].diff>0)\)。

浙公网安备 33010602011771号