1 条题解
-
0
题解:树上取苹果的最大幸福度
问题转化
给定一棵以 为根的树,每个节点 有 个苹果,每个苹果价值 。取苹果规则:
- 如果在节点 取了至少一个苹果,则必须在其父节点也取至少一个苹果。
- 设总共取了 个苹果,取了苹果的节点的最大深度为 (根深度为 ),要求 。
目标:最大化总价值。
关键观察
1. 深度与取苹果的关系
令取了苹果的节点集合为 , 非空。设 ,则 。
条件 可写为 ,其中 , 是在节点 取的苹果数,。
2. 规则1的传递性
规则1意味着:如果节点 取了苹果,则从 到根的整条路径上的每个节点都必须取至少一个苹果。
因此, 必须是一个包含根节点的连通子图(到根的路径连通)。
设 是某个深度 的节点为最深节点的连通块(包含根),则所有节点 必须取 ,且 外的节点不能取苹果。
3. 问题转化为选择深度和连通块
枚举最深深度 ( 树高),选择以某个深度为 的节点 为最深节点的连通块 (包含根到 的路径上的所有节点),并在 内取苹果,满足 ,最大化 。
由于 ,我们希望在不超过总数限制的情况下,尽量多取苹果,且优先取 大的苹果。
4. 转化为背包问题
对于固定的连通块 ,问题变为:每个节点 有 个物品,每个物品价值 ,体积为 ,总容量 ,且每个节点至少选 个物品(因为取了至少一个苹果)。
设 表示额外可以多取的苹果数(已经取了至少 个),则问题变为:
- 首先每个节点取 个苹果,基础价值 ,已用体积 。
- 剩余容量 ,每个节点最多再取 个苹果,每个苹果价值 。
- 在容量 内,从所有节点中选择若干额外苹果,最大化总价值。
这是经典的分组背包:每组是节点 ,有 个相同价值 的物品(体积均为 ),最多选 个。
5. 贪心选择
由于每组内物品价值相同,最优策略是优先选择价值 大的节点多取苹果。
因此,对于固定的 ,将所有节点按 降序排序,然后贪心取前若干大的 的额外苹果,直到达到容量 或没有额外苹果可拿。
6. 枚举连通块
树高可能较大,但 可达 ,。
直接枚举每个节点 作为最深节点,其连通块 就是根到 的路径上的所有节点。
设 表示根到 的路径节点集合,。则 ,容量 ,基础占用体积 ,剩余容量 。
因此,剩余容量只与 有关,与 无关!
因为 。所以对于任意节点 ,可额外取的苹果数不超过 。
7. 统一问题
现在问题简化为:
对于每个节点 ,取根到 路径上所有节点至少一个苹果(基础价值 ),然后还可以额外取最多 个苹果(从路径上的节点取,每个节点 最多额外取 个,每个价值 ),最大化总价值。总价值 = + 从 中贪心选最多 个额外苹果的最大价值。
8. 转化为树上问题
我们需要对每个节点 计算:
其中 表示从 中选最多 个额外苹果(节点 最多 个)的最大价值。
由于 都为正,贪心就是取 最大的那些苹果。
9. 维护路径上的价值前 大苹果
对于每个节点 ,需要知道根到 路径上所有节点的 对,并从中选出最多 个价值最大的苹果。
由于 很大(可达 ),但 ,, 可能很大( 可达 ),但实际额外苹果数受 限制。
我们可以按 值( 到 )分组。对每个 ,统计路径上 的节点的额外苹果总数 。
贪心时,从 向下取,每次取 个价值 的苹果。
10. 树上前缀和
设 表示根到 路径上 的节点的额外苹果总数 之和。
则对节点 ,。
那么 $\text{greedy}(P(u), k) = \sum_{v=100}^{1} v \times \min(pre_v[u], rem)$,其中 是剩余可取的苹果数,初始 ,每次减去已取的。
11. 计算答案
对每个节点 :
- 计算 (根到 路径上 之和)。
- 计算 对所有 。
- 贪心取额外苹果:
,
从 到 :
- 最终答案 =
12. 预处理前缀和
DFS 遍历树,维护当前路径上的 和 数组。
由于 , 只有 个值,可以 更新。
复杂度: 预处理, 计算每个节点的贪心(因为每次从 到 扫描)。
总复杂度 ,可过。
13. 处理大
可能很大(),但 ,所以实际最多取 个额外苹果。
在统计 时,如果 ,可以截断为 ,因为再多也无用。因此令 ,再累加到 中。
但注意 是多个节点的 之和,可能超过 ,所以贪心取 即可。
14. 算法步骤
- 读入 ,对每组数据:
- 读入 和树结构。
- 对每个节点 ,计算 (如果 则不能取,但题目保证 )。
- DFS 从根开始:
- 维护当前路径的 和数组 。
- 进入节点 时,更新:
- 计算当前节点的答案 : , 从 到 : 更新全局最大值。
- 递归子节点。
- 回溯时恢复 和 。
- 输出全局最大值。
15. 注意
- 根节点必须取至少一个苹果(因为如果取任何苹果,根必须取)。
- 如果 ,则只能取路径上的基础苹果(每个节点恰好取 个)。
- 答案可能超过 位整数,用 位存储。
复杂度分析
- 每组数据:
- ,,总操作约 万次,可过。
- 1
信息
- ID
- 6078
- 时间
- 5000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 1
- 上传者