Gravatar
遥时_彼方
积分:699
提交:130 / 422

Pro1962  [HAOI 2015]树上染色

题目要求共有 $n$ 个结点,将其中 $k$ 个点染成黑色(本题解中为了方便描述,通称所有未染色的点为白点),求黑点两两距离及白点两两距离,使他们之和最大。

我们可以将距离转化为路径,然后再将路径拆分成边,就可以记录每条边被经过的次数,直接计算即可。

问题来了!:那么每条边会对答案贡献多少呢?

我们不妨设这条边的一侧共有 $w$ 个点,其中有 $t$ 个点被染成黑色了;

那么这一侧共有 $t$ 个黑点,($w-t$)个白点;类似,另一侧有($k-t$)个黑点,($n-w-k+t$)个白点;

令 $sz$ 为这条边的边权,那么贡献就是 $val=sz*(t*(k-t)+(w-t)*(n-w-k+t))$;

解题的大致思路就是计算每条边对答案的贡献,最后利用状态转移方程求出最优解。

首先给出状态数组:$f[x][y]$;

$f[x][y]$ 表示给以 $x$ 为根结点的子树染上 $y$ 个点所得的对于整棵树的最大贡献;


方程如下:

$f[i][j]=max(f[i][j],f[i][j-t]+f[z][t]+val);$( $z$ 表示 $i$ 的子结点)

目标状态:$f[1][k]$;

PS:中间可能遇到非法情况,建议把 $f[x][y]$ 预处理成非法情况,方便跳过处理(代码最后有针对这点的样例,可自行调试);

强烈建议参考代码理解!!!!!

Over.

(第一次写题解,不足之处请大家多多包涵》_《)



2026-01-29 18:24:47    
我有话要说
暂无人分享评论!