#P12710. [KOI 2021 Round 1] 两个团队
[KOI 2021 Round 1] 两个团队
题目背景
试题来源:https://koi.or.kr/archives/。中文翻译做了少量本土化修改。
按照署名—非商业性使用—相同方式共享 4.0 协议国际版进行授权。
题目描述
某公司的组织架构可以用一棵有根树(rooted tree)来表示。树中的每个节点表示一名员工,边表示直属上下级关系。每位员工从 到 编号,其中编号 的员工是公司的总裁,即树的根节点。每位员工都有一个整数形式的“能力值”,该能力值可能为负数。
下面是一棵示意组织树的例子,节点内的数字表示员工编号。
现在希望从中选择若干人担任“团队负责人”。每位团队负责人必须组成自己的团队,团队必须满足以下条件:
- 团队成员必须是该负责人下属员工(不一定是直属下属)。例如,如果员工 是负责人,那么员工 或 可以是团队成员,但员工 或 不可以。
- 如果某员工被包含为团队成员,那么该员工的直属上司也必须被包含为团队成员(负责人除外)。例如,若员工 是负责人,则团队为 是合法的,但 是不合法的,因为员工 的上司 没有被包含。
- 团队的得分定义为团队负责人及所有成员的能力值总和,团队成员的选择必须使团队得分最大。(若得分最大的团队组成不唯一,可任选其一。)例如,在所有员工的能力值均为正的情况下,若员工 被选为负责人,则其团队必须为 ,其中任何一人缺席都不被允许。
- 员工不能同时属于两个团队(包括不能作为另一个团队的负责人)。也就是说,若某员工 是负责人,其下属 由于第 3 条必须包含进 的团队,则 和 都不能被选为负责人。
公司最终希望选出两名团队负责人,组成两个团队,使这两个团队的得分总和(即所有成员能力值之和的总和)最大。
请你编写一个程序,计算在满足所有约束条件的前提下,这两个团队得分之和的最大值。
输入保证一定存在合法的两个团队的构成方式。
输入格式
第一行输入一个整数 ,表示员工人数。
接下来的 行中,每行输入两个整数,分别表示第 位员工的能力值和直属上司的编号,两数之间以空格分隔。其中员工 没有上司,因此其上司编号为 。
输出格式
输出一个整数,表示两个团队得分之和的最大值,占据一行。
(提示:输出结果可能非常大,请在 C/C++ 中使用 long long
类型,在 Java 中使用 long
类型。)
4
3 -1
-2 1
2 2
-1 1
5
提示
约束条件
- 每名员工的能力值在 到 之间
- 除员工 外的每位员工 的直属上司编号不超过
- 输入保证一定可以构成符合要求的两个团队
子任务
- (17 分)所有员工的能力值均为正数
- (12 分),且员工 的直属上司为 (员工 除外)
- (20 分)员工 的直属上司为 (员工 除外)
- (16 分)
- (17 分)
- (18 分)无附加约束条件