QOJ.ac

QOJ

Time Limit: 6 s Memory Limit: 256 MB Total points: 100

#10628. 投票

Statistics

某公司总裁希望通过组织“柑橘星期四”活动来提高员工士气。他无法决定是购买橙子还是葡萄柚,因此决定让员工们自己投票决定。

投票将按照公司层级进行。公司共有 $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_ndaj_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 执行的后续动作。

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.