某公司总裁希望通过组织“柑橘星期四”活动来提高员工士气。他无法决定是购买橙子还是葡萄柚,因此决定让员工们自己投票决定。
投票将按照公司层级进行。公司共有 $n$ 名员工,编号从 $1$ 到 $n$,其中编号为 $1$ 的是总裁。每位员工要么是主管,要么是普通员工,总裁一定是主管。每位主管直接下属的人数均为奇数,这些下属可能是普通员工,也可能是其他主管。普通员工没有下属。除总裁外(总裁没有上级),每位员工都有且仅有一个直接上级。公司层级结构中不存在环。
每位普通员工独立决定投票支持橙子还是葡萄柚。每位主管的投票结果取决于其(直接)下属中多数人的投票结果。最终投票结果取决于总裁的投票。
Bajtazar 是橙子批发商,他希望橙子在投票中获胜。不幸的是,他的好友 Bajtoni 是葡萄柚批发商,他希望葡萄柚获胜。于是朋友们决定玩一个游戏:他们轮流(从 Bajtazar 开始)选择一名尚未被交谈过的普通员工,并说服其投票支持自己偏好的柑橘(Bajtazar 和 Bajtoni 都有极强的说服力)。当所有普通员工都被交谈过后,游戏结束。
请帮助 Bajtazar 确定如何选择员工,以确保最终橙子在投票中获胜。你可以假设公司层级结构的设计使得 Bajtazar 总是能够(无论 Bajtoni 如何行动)获得胜利。
交互
你需要实现一个程序来帮助 Bajtazar,并使用提供的库(模拟 Bajtoni 的行动)。
要使用该库,请在你的程序中包含:
C/C++: #include "glolib.h"
Python: from glolib import daj_n, daj_przelozonego, ruch
该库提供以下函数:
daj_n() – 该函数返回整数 $n$,表示公司员工总数。
daj_przelozonego(v) – 该函数返回编号为 $v$ 的员工的直接上级编号(对于 $1 < v \le n$)。上级的编号总是小于员工的编号。
* ruch(x) – 该函数通知库 Bajtazar 进行了下一步行动,选择了编号为 $x$ 的普通员工。函数返回 Bajtoni 在下一步中选择的员工编号。如果 Bajtazar 的行动是整场游戏中的最后一步,则在调用此函数后,程序将自动终止(你可以假设总是由 Bajtazar 执行最后一步)。
你可以多次使用 daj_n 和 daj_przelozonego 函数。你的程序不得打开任何文件,也不得使用标准输入和输出。程序可以使用标准错误输出 (stderr),但请记住这会消耗宝贵的时间。你的解决方案将与库一起通过以下命令编译:
C++: g++ -O3 -static -std=c++17 glolib.cpp glo.cpp
Python: python3 glo.py
注意:上述内存限制仅适用于你的解决方案,不包括库所使用的内存。
子任务
测试集分为以下子任务。每个子任务的测试由一组或多组独立的测试用例组成。
| 子任务 | 数据范围 | 分数 |
|---|---|---|
| 1 | $2 \le n \le 13$ | 20 |
| 2 | $2 \le n \le 1000$ | 40 |
| 3 | $2 \le n \le 200\,000$ | 40 |
样例
以下是样例测试的程序运行过程,其中公司层级结构如下:
| 调用 | 返回值 | 说明 |
|---|---|---|
daj_n() |
7 | $n = 7$ |
daj_przelozonego(2) |
1 | 2 的上级是 1 |
daj_przelozonego(3) |
2 | 3 的上级是 2 |
daj_przelozonego(4) |
1 | 4 的上级是 1 |
daj_przelozonego(5) |
1 | 5 的上级是 1 |
daj_przelozonego(6) |
2 | 6 的上级是 2 |
daj_przelozonego(7) |
2 | 7 的上级是 2 |
ruch(3) |
5 | Bajtazar 与员工 3 交谈,Bajtoni 与 5 交谈 |
ruch(7) |
4 | Bajtazar 与员工 7 交谈,Bajtoni 与 4;此步后 Bajtazar 已无获胜机会 |
ruch(6) |
Bajtazar 与员工 6 交谈;程序结束 |
如果 Bajtazar 在第二步中选择了员工 4,他将确保获得胜利。
说明
- 测试用例“ocen”:
- 1ocen: $n = 19$,总裁有 3 名主管下属,每名主管各有 5 名普通员工下属;
- 2ocen: $n = 364$,每名主管直接下属恰好 3 人,且所有普通员工距离总裁的距离相同;
- 3ocen: $n = 200\,000$,公司有 $100\,001$ 名主管,每名主管(除总裁外)都是编号比其小 1 的主管的直接下属;此外,$99\,999$ 名普通员工直接隶属于编号为 $100\,001$ 的主管。
实现细节
示例错误解决方案及示例库位于 dlazaw 文件夹中。库的行为可能与评测系统中的不同,且不一定满足题目假设。它们仅用于展示与程序的交互方式。
你的解决方案与示例库编译后,会从标准输入读取公司层级结构的描述——数字 $n$,随后是 $n-1$ 个空格分隔的数字 $p_2, \dots, p_n$,其中 $p_i$ 表示编号为 $i$ 的员工的直接上级编号。在示例库中,Bajtoni 总是说服编号最小且尚未被说服的普通员工。在 SIO 的样例测试和“ocen”测试中也使用相同的策略。示例库会输出 Bajtazar 和 Bajtoni 执行的后续动作。