西电校赛2020D题——双倍快乐
题意:
给你一个树,树上每个人有一个价值。定义一个快乐值:
- 叶子结点的快乐值为价值
- 其他结点的快乐值为儿子快乐值值和加上自己的价值
树上每条边要么是黑的要么是白的,如果一个结点既有黑边又有白边,那么它的价值就会翻倍。
现在允许你修改任意一条边的颜色,也可以不修改,问你能达到的最大全体快乐的总和是多少。
这题本来想 DP 做的,在队友的提示下可以从考虑修改每一条边造成的贡献入手。
每个点的快乐值实际上就是子树权值和,因此每个点对答案的贡献就是它的价值乘上深度。
如果修改一条边的颜色,那么这条边的两个端点有如下三种可能:
- 权值翻倍
- 无事发生
- 权值减半
且两个端点的贡献可以独立考虑。
要判断是哪种情况,只需统计每条边原先连接的黑白边个数。假设从 A 边修改成了 B 边,那么:
- 如果原先没有 B 边且 A 边至少有两个,那么价值翻倍
- 如果原先只有 1 个 B 边且有 A 边,那么价值减半
- 否则无事发生
可以先统计原先的快乐值总和,然后维护最大的可以得到的快乐值增加量。这个增加量初值为 0 ,表示可以不改。最后输出原先总和 + 最大增量即可。
代码:
1 |
|