1 条题解
-
0
题目解法概述
主要思路
本题的核心是处理树上路径上的收费站选择问题,需要在金币和银币两种支付方式间做出最优决策,使得最终保留的金币数量最大化。
关键观察
- 路径确定:由于树的结构,任意两点间的路径是唯一的
- 收费站的独立性:每个收费站可以独立选择支付金币(1枚)或银币(枚)
- 目标函数:最大化保留的金币数,等价于最小化消耗的金币数
算法步骤
1. 预处理
- 建立树的邻接表表示
- 计算每个节点的深度、父节点信息(用于LCA查询)
- 预处理每个收费站的信息(所在道路、银币费用)
2. 路径信息收集
对于每个查询:
- 找到路径上的所有收费站
- 收集这些收费站的银币费用
3. 贪心策略
设路径上有个收费站,每个收费站的银币费用为:
- 将收费站的银币费用按升序排序
- 从银币费用最小的收费站开始,尽量使用银币支付
- 计算能够用银币支付的收费站数量:
- 累计所需银币总数,直到超过公民拥有的银币数
- 或者遍历完所有收费站
- 设能用银币支付的收费站数量为,则需要用金币支付的收费站数量为
4. 可行性判断与答案计算
设:
- = 公民拥有的金币数
- = 公民拥有的银币数
- = 路径上的收费站总数
- = 能用银币支付的收费站数量
则:
- 可行性条件:(即总资源足够支付所有收费站)
- 最大保留金币数:如果可行,则为
时间复杂度优化
- 使用倍增法或Tarjan算法进行LCA查询,单次
- 路径上收费站信息的收集可以通过树上差分预处理
- 总时间复杂度:
算法总结
对于每个查询:
- 找到路径上的所有收费站
- 将这些收费站的银币费用排序
- 贪心地用银币支付费用最小的收费站
- 判断剩余的金币是否足够支付其他收费站
- 计算最终能保留的金币数量
边界情况处理
- 如果路径上没有收费站:直接返回(不消耗金币)
- 如果银币足够支付所有收费站:返回(全用银币支付)
- 如果金币不足:返回(不可行)
核心公式
设排序后的银币费用为, 找到最大的使得:
则答案为:
$$\text{ans} = \begin{cases} X_k - (L - cnt) & \text{if } X_k + cnt \ge L \\ -1 & \text{otherwise} \end{cases} $$
- 1
信息
- ID
- 6106
- 时间
- 4000ms
- 内存
- 1024MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 1
- 上传者