P16454 [APIO 2026] Scallion Pancake Party(暂无数据)

题目描述

Bohan 正在举办一场派对。由于他热爱葱油饼,他决定从附近的商店购买一些为派对做准备。这家商店出售 $N$ 种不同口味的葱油饼,编号从 $0$ 到 $N - 1$。Bohan 决定每种口味购买 $N$ 张葱油饼,总计 $N^2$ 张。每张葱油饼在装入独立的袋子之前,会被切成 $K$ 个完全相同的小片。袋子编号从 $0$ 到 $N^2 - 1$。记 $F[i]$ 表示袋子 $i$ 中葱油饼的口味。 派对期间,Bohan 邀请所有客人参与一个游戏。游戏过程如下。 首先,Bohan 挑选 $N$ 位客人,并将他们分别带入编号为 $0$、$1$、……、$N - 1$ 的房间,每个房间恰好有一位客人。其余客人留在外面,直到游戏结束。所有 $N$ 个房间看起来完全一样,因此客人无法分辨自己身处哪个房间。 接着,对于每个房间 $i$ ($0 \le i < N$),Bohan 进入房间 $i$ 并悄悄告诉里面的客人一个整数 $P[i]$,代表一种**禁忌口味**。他可能会、也可能不会同时告诉客人他们所在的房间编号。Bohan 保证 $[P[0], P[1], \cdots, P[N - 1]]$ 是 $[0, 1, \cdots, N - 1]$ 的一个排列。 然后,游戏进行 $N$ 轮。在第 $i$ 轮中,Bohan 将袋子 $0, 1, \cdots, N^2 - 1$ 按照顺序一个接一个地送入房间 $i - 1$。当房间 $i - 1$ 中的客人收到袋子 $j$ 时,他们会得知: * $F[j]$,即袋子 $j$ 中所装的葱油饼口味,以及 * 袋子中剩余的小片数量。 在接收下一个袋子之前,房间 $i - 1$ 中的客人必须决定从当前袋子中吃掉多少片。他们能吃掉的小片数量取决于以下情况: * 如果 $P[i - 1] \ne F[j]$,该客人可以从袋子中取出任意数量的小片并吃掉。 * 如果 $P[i - 1] = F[j]$,该客人不允许吃掉任何小片。 注意,客人们事先并不知道序列 $F[0], F[1], \cdots, F[N^2 - 1]$。 所有 $N$ 轮结束后,留在外面的客人会得到袋子的序列。看到这些袋子后,他们会得知每张葱油饼的口味以及每个袋子中剩余的小片数量。凭借这些信息,他们必须确定出 $P[0], P[1], \cdots, P[N - 1]$ 的值。 客人可以在游戏开始前进行沟通。他们事先也知道 $N$ 和 $K$ 的值。你的目标是实现一个策略,使得外面的客人总能正确推断出 $P[0], P[1], \cdots, P[N - 1]$ 的值。 ### 实现细节 你需要实现三个函数。 对于房间 $0, 1, \cdots, N - 1$ 中的客人,你需要实现以下两个函数。 ```cpp void init(int N, int K, int p, int r) ``` 假设该客人位于房间 $i$。 * $N$:葱油饼的口味数量。 * $K$:游戏开始前每张葱油饼被切成的小片数。 * $p = P[i]$:房间 $i$ 中禁止食用的口味。 * 如果 Bohan 决定告诉客人他们所在的房间,则 $r = i$。否则 $r = -1$。 ```cpp int strategy(int b, int f, int s) ``` 假设该客人位于房间 $i$。 * $b$:当前袋子的编号。 * $f = F[b]$:袋子 $b$ 中葱油饼的口味。 * $s$:袋子 $b$ 中剩余的小片数量。 * 该函数应返回一个非负整数 $x$,代表该客人决定吃掉的小片数量。 * 如果 $f \ne P[i]$,则必须满足 $0 \le x \le s$。 * 如果 $f = P[i]$,则必须满足 $x = 0$。 你需要为外面的客人实现以下函数。 ```cpp std::vector guess(int N, int K, std::vector F, std::vector S) ``` * $N$:葱油饼的口味数量。 * $K$:游戏开始前每张葱油饼被切成的小片数。 * $F$:长度为 $N^2$ 的数组,其中 $F[i]$ 是袋子 $i$ 中葱油饼的口味。 * $S$:长度为 $N^2$ 的数组,其中 $S[i]$ 是经过所有 $N$ 轮后袋子 $i$ 中剩余的小片数量。 * 该函数应返回一个长度为 $N$ 的数组 $P$,其中 $P[i]$ 是给房间 $i$ 中客人的数字。 每个测试用例包含 $T$ 场独立的游戏。 在评测过程中,对于 $T$ 场游戏中的每一场,将会启动 $N + 1$ 个进程。对于每个满足 $0 \le i < N$ 的 $i$,进程 $i$ 代表房间 $i$ 中的客人。进程 $N$ 代表外面的客人。对于每个满足 $0 \le i < N$ 的 $i$,进程 $(i + 1)$ 在进程 $i$ 结束后启动。 对于进程 $0$ 到 $N - 1$: * `init` 恰好被调用一次。 * `strategy` 在 `init` 之后被调用 $N^2$ 次。 * 保证在第 $j$ 次调用时,$b = j - 1$。 对于进程 $N$: * `guess` 恰好被调用一次。 评测器可能会交错执行来自不同游戏的进程,但保证每一单独游戏内的进程相对顺序得以保持。

输入格式

样例评测器仅支持**每个测试用例一场游戏**。 输入格式: ``` N K P[0] P[1] ... P[N-1] F[0] F[1] ... F[N*N-1] reveal ``` * `reveal` 为 $0$ 或 $1$。 * 如果 `reveal` 为 $0$,评测器将表现得好像 Bohan 没有告诉任何人他们的房间编号。 * 如果 `reveal` 为 $1$,评测器将表现得好像 Bohan 告诉了所有人他们的房间编号。

输出格式

如果 `guess` 返回的数组与 $[P[0], P[1], ..., P[N - 1]]$ 相符,样例评测器将打印 ``` Accepted ``` 此外,评测器会按顺序打印所进行的函数调用,以供调试。

说明/提示

### 样例 考虑这样一个场景:在测试用例的唯一一场游戏中,$T = 1$,$N = 2$,$K = 2$,$P = [1, 0]$,$F = [1, 0, 0, 1]$。 令 $S[i]$ 表示袋子 $i$ 中当前剩余的小片数。初始时,$S = [2, 2, 2, 2]$。 假设客人在游戏开始前约定以下策略。 * 对于房间中的客人,当他们被允许食用当前葱油饼时: * 如果当前葱油饼是他们能够食用的第一张,则他们将吃掉所有剩余的小片。 * 否则,他们只吃掉一片。 * 对于外面的客人: * 如果 $S = [0, 0, 1, 1]$,他们将猜测 $P = [1, 0]$。 * 否则,他们将猜测 $P = [0, 1]$。 游戏过程如下。 首先,评测器启动进程 $0$,代表房间 $0$ 中的客人,并调用 `init(2, 2, 1, -1)`。初始化之后,评测器进行以下调用: | **函数调用** | **返回值** | |:-:|:-:| | `strategy(0, 1, 2)` | $0$ | | `strategy(1, 0, 2)` | $2$ | | `strategy(2, 0, 2)` | $1$ | | `strategy(3, 1, 2)` | $0$ | 第一次和第四次调用必须返回 $0$,因为 $P[0] = F[0] = F[3] = 1$。 此进程结束后(第 $1$ 轮完成),$S = [2, 0, 1, 2]$。 接着,评测器启动进程 $1$,代表房间 $1$ 中的客人,并调用 `init(2, 2, 0, -1)`。初始化之后,评测器进行以下调用: | **函数调用** | **返回值** | |:-:|:-:| | `strategy(0, 1, 2)` | $2$ | | `strategy(1, 0, 0)` | $0$ | | `strategy(2, 0, 1)` | $0$ | | `strategy(3, 1, 2)` | $1$ | 注意,第二次和第三次调用必须返回 $0$,因为 $P[1] = F[1] = F[2] = 0$。 此进程结束后(第 $2$ 轮完成),$S = [0, 0, 1, 1]$。 最后,评测器启动进程 $2$,代表外面的客人。评测器进行以下调用: | **函数调用** | **返回值** | |:-:|:-:| | `guess(2, 2, [1, 0, 0, 1], [0, 0, 1, 1])` | `[1,0]` | 外面的客人猜出了正确的排列。因此,该测试用例被视为正确。 请注意,这种方法并非总能让外面的客人正确猜出排列。 本题的附件包中除了本例外还包含另一组不同的样例输入。 ### 数据范围 * $1 \le T \le 400$。 * $2 \le N \le 30$。 * 每个测试用例中所有游戏的 $N^3$ 之和不超过 $27\,000$。 * $1 \le K \le N$ * $K \in \{1, 3, N\}$。 * $[P[0], P[1], \cdots, P[N - 1]]$ 是 $[0, 1, \cdots, N - 1]$ 的一个排列。 * 对于每个满足 $0 \le j < N^2$ 的 $j$,有 $0 \le F[j] < N$。 * 对于每个满足 $0 \le i < N$ 的 $i$,在 $[F[0], F[1], \cdots, F[N^2 - 1]]$ 中 $i$ 恰好出现 $N$ 次。 * 评测器**不是自适应**的,也就是说,$[P[0], P[1], \cdots, P[N - 1]]$ 和 $[F[0], F[1], \cdots, F[N^2 - 1]]$ 在第一次调用 `init` 之前就已经固定。 ### 子任务 | **子任务** | **分值** | **附加约束** | |:-:|:-:|:-:| | $1$ | $8$ | $K = 1, N = 2$。 | | $2$ | $7$ | $K = 1$ 且 Bohan 决定告诉每个人他们所在的房间编号。 | | $3$ | $14$ | $K = 1$ 且对于每个满足 $0 \le i < N$ 的 $i$,$[F[i \cdot N], F[i \cdot N + 1], \cdots, F[i \cdot N + N - 1]]$ 是 $[0, 1, \cdots, N - 1]$ 的一个排列。 | | $4$ | $18$ | $K = N$。 | | $5$ | $21$ | $K = 3, N \ge 3$。 | | $6$ | $32$ | $K = 1$。 | 翻译由 DeepSeek V4 Pro 完成