1 条题解
-
0
题目分析
我们有 个候选人(编号 ),以及一个固定的 JYY(编号 )。
每个候选人 有一个推荐人 ,如果选了 ,则必须选 。
JYY 已经在团队中。
我们要选恰好 个候选人(不含 JYY),使得:最大。
思路
这是一个典型的分数规划 + 树形依赖背包问题。
1. 分数规划
设最大比值为 ,那么有:
等价于 即
因此我们可以二分答案 ,然后判断是否存在一个合法选择方案(恰好 个候选人,满足依赖关系),使得 。
2. 依赖背包
依赖关系形成一棵以 为根的树( 是父节点)。
我们需要在树上做背包:
表示在 的子树中,选择 个节点(不含 本身)的最大 值。注意:选子树节点之前必须选 ,所以 的权值在进入子树时已经计算。
3. 转移方式
对于节点 ,初始化 (不选任何子节点)。
遍历每个子节点 ,用分组背包的方式合并:
新 从旧 和 合并:
对于 从 到 (倒序,避免重复选取同一子树),
对于 从 到 \text{size}[v]( 子树中最多选的节点数),
如果 ,则:$ dp[u][j+k] = \max(dp[u][j+k], dp[u][j] + dp[v][k]) $
合并完所有子节点后,如果 ,则我们可以选择 本身,那么需要把 的权值 加到所有状态中(因为选 才能选它的子树,所以合并完子树后加上 的贡献):
对于 从 到 : $ dp[u][j+1] = \max(dp[u][j+1], dp[u][j] + (P_u - x \cdot S_u)) $
注意:JYY(节点 0)不占 名额,但必须选,所以它的权值在最后判断时单独加上。
4. 最终判断
二分检查时,我们看 是否成立。
时间复杂度
- 二分次数:,一般 次足够。
- 每次 DP:,因为树形背包在限制背包大小 时,每对节点只在 LCA 处合并一次,总复杂度 。
总复杂度:,在 时可行。
- 1
信息
- ID
- 4769
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者