luogu#P16454. [APIO 2026] Scallion Pancake Party
[APIO 2026] Scallion Pancake Party
背景
无需引入 party.h 头文件。由于 grader 性能较低,因此额外提供了 2 秒时间限制。
题目描述
Bohan 正在举办一场派对。由于他热爱葱油饼,他决定从附近的商店购买一些为派对做准备。这家商店出售 种不同口味的葱油饼,编号从 到 。Bohan 决定每种口味购买 张葱油饼,总计 张。每张葱油饼在装入独立的袋子之前,会被切成 个完全相同的小片。袋子编号从 到 。记 表示袋子 中葱油饼的口味。
派对期间,Bohan 邀请所有客人参与一个游戏。游戏过程如下。
首先,Bohan 挑选 位客人,并将他们分别带入编号为 、、……、 的房间,每个房间恰好有一位客人。其余客人留在外面,直到游戏结束。所有 个房间看起来完全一样,因此客人无法分辨自己身处哪个房间。
接着,对于每个房间 (),Bohan 进入房间 并悄悄告诉里面的客人一个整数 ,代表一种禁忌口味。他可能会、也可能不会同时告诉客人他们所在的房间编号。Bohan 保证 是 的一个排列。
然后,游戏进行 轮。在第 轮中,Bohan 将袋子 按照顺序一个接一个地送入房间 。当房间 中的客人收到袋子 时,他们会得知:
- ,即袋子 中所装的葱油饼口味,以及
- 袋子中剩余的小片数量。
在接收下一个袋子之前,房间 中的客人必须决定从当前袋子中吃掉多少片。他们能吃掉的小片数量取决于以下情况:
- 如果 ,该客人可以从袋子中取出任意数量的小片并吃掉。
- 如果 ,该客人不允许吃掉任何小片。
注意,客人们事先并不知道序列 。
所有 轮结束后,留在外面的客人会得到袋子的序列。看到这些袋子后,他们会得知每张葱油饼的口味以及每个袋子中剩余的小片数量。凭借这些信息,他们必须确定出 的值。
客人可以在游戏开始前进行沟通。他们事先也知道 和 的值。你的目标是实现一个策略,使得外面的客人总能正确推断出 的值。
实现细节
你需要实现三个函数。
对于房间 中的客人,你需要实现以下两个函数。
void init(int N, int K, int p, int r)
假设该客人位于房间 。
- :葱油饼的口味数量。
- :游戏开始前每张葱油饼被切成的小片数。
- :房间 中禁止食用的口味。
- 如果 Bohan 决定告诉客人他们所在的房间,则 。否则 。
int strategy(int b, int f, int s)
假设该客人位于房间 。
- :当前袋子的编号。
- :袋子 中葱油饼的口味。
- :袋子 中剩余的小片数量。
- 该函数应返回一个非负整数 ,代表该客人决定吃掉的小片数量。
- 如果 ,则必须满足 。
- 如果 ,则必须满足 。
你需要为外面的客人实现以下函数。
std::vector<int> guess(int N, int K, std::vector<int> F, std::vector<int> S)
- :葱油饼的口味数量。
- :游戏开始前每张葱油饼被切成的小片数。
- :长度为 的数组,其中 是袋子 中葱油饼的口味。
- :长度为 的数组,其中 是经过所有 轮后袋子 中剩余的小片数量。
- 该函数应返回一个长度为 的数组 ,其中 是给房间 中客人的数字。
每个测试用例包含 场独立的游戏。
在评测过程中,对于 场游戏中的每一场,将会启动 个进程。对于每个满足 的 ,进程 代表房间 中的客人。进程 代表外面的客人。对于每个满足 的 ,进程 在进程 结束后启动。
对于进程 到 :
init恰好被调用一次。strategy在init之后被调用 次。- 保证在第 次调用时,。
对于进程 :
guess恰好被调用一次。
评测器可能会交错执行来自不同游戏的进程,但保证每一单独游戏内的进程相对顺序得以保持。
输入格式
样例评测器仅支持每个测试用例一场游戏。
输入格式:
N K
P[0] P[1] ... P[N-1]
F[0] F[1] ... F[N*N-1]
reveal
reveal为 或 。- 如果
reveal为 ,评测器将表现得好像 Bohan 没有告诉任何人他们的房间编号。 - 如果
reveal为 ,评测器将表现得好像 Bohan 告诉了所有人他们的房间编号。
- 如果
输出格式
如果 guess 返回的数组与 相符,样例评测器将打印
Accepted
此外,评测器会按顺序打印所进行的函数调用,以供调试。
提示
样例
考虑这样一个场景:在测试用例的唯一一场游戏中,,,,,。
令 表示袋子 中当前剩余的小片数。初始时,。
假设客人在游戏开始前约定以下策略。
- 对于房间中的客人,当他们被允许食用当前葱油饼时:
- 如果当前葱油饼是他们能够食用的第一张,则他们将吃掉所有剩余的小片。
- 否则,他们只吃掉一片。
- 对于外面的客人:
- 如果 ,他们将猜测 。
- 否则,他们将猜测 。
游戏过程如下。
首先,评测器启动进程 ,代表房间 中的客人,并调用 init(2, 2, 1, -1)。初始化之后,评测器进行以下调用:
| 函数调用 | 返回值 |
|---|---|
strategy(0, 1, 2) |
|
strategy(1, 0, 2) |
|
strategy(2, 0, 2) |
|
strategy(3, 1, 2) |
第一次和第四次调用必须返回 ,因为 。
此进程结束后(第 轮完成),。
接着,评测器启动进程 ,代表房间 中的客人,并调用 init(2, 2, 0, -1)。初始化之后,评测器进行以下调用:
| 函数调用 | 返回值 |
|---|---|
strategy(0, 1, 2) |
|
strategy(1, 0, 0) |
|
strategy(2, 0, 1) |
|
strategy(3, 1, 2) |
注意,第二次和第三次调用必须返回 ,因为 。
此进程结束后(第 轮完成),。
最后,评测器启动进程 ,代表外面的客人。评测器进行以下调用:
| 函数调用 | 返回值 |
|---|---|
guess(2, 2, [1, 0, 0, 1], [0, 0, 1, 1]) |
[1,0] |
外面的客人猜出了正确的排列。因此,该测试用例被视为正确。
请注意,这种方法并非总能让外面的客人正确猜出排列。
本题的附件包中除了本例外还包含另一组不同的样例输入。
数据范围
- 。
- 。
- 每个测试用例中所有游戏的 之和不超过 。
- 。
- 是 的一个排列。
- 对于每个满足 的 ,有 。
- 对于每个满足 的 ,在 中 恰好出现 次。
- 评测器不是自适应的,也就是说, 和 在第一次调用
init之前就已经固定。
子任务
| 子任务 | 分值 | 附加约束 |
|---|---|---|
| 。 | ||
| 且 Bohan 决定告诉每个人他们所在的房间编号。 | ||
| 且对于每个满足 的 ,$[F[i \cdot N], F[i \cdot N + 1], \cdots, F[i \cdot N + N - 1]]$ 是 的一个排列。 | ||
| 。 | ||
| 。 | ||
| 。 |
翻译由 DeepSeek V4 Pro 完成