K 先生为 JOI 决赛的选手准备了一个游戏。K 先生秘密持有一个 $N \times N$ 的表格 $A$,其中每个单元格都包含一个非负整数。令 $A_{i,j}$ 表示从顶部起第 $(i+1)$ 行($0 \le i \le N - 1$)和从左侧起第 $(j+1)$ 列($0 \le j \le N - 1$)的单元格中填写的整数。表格 $A$ 满足以下条件:
- 对于每个满足 $0 \le i \le N - 1$ 的 $i$,都有 $A_{i,i} = 0$。
- 对于每个满足 $0 \le i < j \le N - 1$ 的 $i, j$,都有 $A_{i,j} = A_{j,i}$。
考虑一个具有 $N$ 个顶点的加权无向图,其中顶点 $i$ 和顶点 $j$($0 \le i < j \le N - 1$)之间的边权重为 $A_{i,j}$。令 $X$ 为该图的最小生成树的权重。换句话说,$X$ 是通过以下过程获得的值。游戏的目标是让所有选手合作并确定 $X$ 的值。
- 令 $x = 0$。
- 考虑一个具有 $N$ 个顶点的无向图 $G$。$G$ 的顶点编号为 $0, 1, \dots, N-1$。最初,$G$ 没有边。
- 重复以下操作 $N - 1$ 次。令 $X$ 为这 $N - 1$ 次操作后的 $x$ 值。 i. 将当前可以通过某些边从顶点 $0$ 到达的 $G$ 的顶点称为近顶点,将其他顶点称为远顶点。选择一对由一个近顶点 $i$ 和一个远顶点 $j$ 组成的对 $(i, j)$,使得值 $A_{i,j} \times N^2 + i \times N + j$ 最小化。可以证明,至少存在一个近顶点和一个远顶点,并且 $(i, j)$ 是唯一确定的。 ii. 将连接顶点 $i$ 和顶点 $j$ 的边添加到 $G$ 中。 iii. 更新 $x \leftarrow x + A_{i,j}$。
定义 $R = \lfloor 5120/N \rfloor$(其中 $\lfloor x \rfloor$ 表示不超过 $x$ 的最大整数)。JOI 决赛共有 $R \times N$ 名选手,分为 $R$ 组,每组 $N$ 名选手。组号为 $0$ 到 $R - 1$,第 $r$ 组($0 \le r \le R - 1$)的选手编号为 $(r, 0), (r, 1), \dots, (r, N - 1)$。
游戏通过重复以下轮次进行,顺序为第 $0, 1, 2, \dots$ 轮,最多 $R$ 轮。在游戏过程中,选手之间不允许交流,但他们可以提前共享策略。
第 $r$ 轮($0 \le r \le R - 1$)按如下方式进行:
- 对于 $i = 0, 1, \dots, N - 1$,按此顺序,K 先生和选手 $(r, i)$ 进行以下交互。
- K 先生向选手 $(r, i)$ 提供以下信息:
- 选手的编号 $(r, i)$,
- 表格 $A$ 中第 $(i+1)$ 行的信息,即 $A_{i,0}, A_{i,1}, \dots, A_{i,N-1}$,
- 整数 $B_{r,i,0}, B_{r,i,1}, \dots, B_{r,i,N-1}$,每个整数都是 $0$ 到 $2^{64}-1$(含)之间的整数,由上一轮的选手发送给选手 $(r, i)$。
- 如果 $r > 0$,这些整数由下述交互 3 确定。
- 如果 $r = 0$,则为方便起见,定义 $B_{r,i,0} = B_{r,i,1} = \dots = B_{r,i,N-1} = 0$。
- 如果选手 $(r, i)$ 能够确定 $X$ 的值,他们向 K 先生回答该值。如果有任何选手给出了答案,游戏立即结束。
- 对于每个 $j = 0, 1, \dots, N - 1$,选手 $(r, i)$ 确定一个整数 $B_{r+1, j, i}$(必须是 $0$ 到 $2^{64}-1$ 之间的整数),发送给选手 $(r+1, j)$,并告知 K 先生。即使在 $r = R-1$ 时,选手 $(r+1, j)$ 不存在,选手 $(r, i)$ 也必须确定 $B_{r+1, j, i}$ 并告知 K 先生。
- K 先生向选手 $(r, i)$ 提供以下信息:
如果回答的 $X$ 值不正确,或者在第 $R-1$ 轮结束时没有人回答 $X$ 的值,则游戏失败。如果在第 $R-1$ 轮结束时回答了正确的 $X$ 值,则游戏成功。使用的轮数越少,得分越高(如果在第 $r$ 轮给出了答案,则轮数计为 $r+1$)。
请为选手实现一种策略,使游戏在尽可能少的轮数内成功。
实现细节
你的提交必须包含 multi.h,并使用 #include 预处理指令,且必须实现以下函数:
std::vector<unsigned long long> strategy(int N, int r, int i,
std::vector<unsigned long long> A, std::vector<unsigned long long> B)
- 参数 $N$ 表示表格 $A$ 的行数和列数。
- 参数 $r$ 和 $i$ 表示选手编号 $(r, i)$。
- 参数 $A$ 是一个长度为 $N$ 的非负整数序列,其中 $A[j]$($0 \le j \le N - 1$)表示表格 $A$ 中从顶部起第 $(i+1)$ 行、从左侧起第 $(j+1)$ 列的单元格中填写的整数 $A_{i,j}$。
- 参数 $B$ 是一个长度为 $N$ 的非负整数序列,其中 $B[j]$($0 \le j \le N - 1$)表示从选手 $(r-1, j)$ 发送给选手 $(r, i)$ 的整数 $B_{r,i,j}$。如果 $r = 0$,则 $B[j] = 0$。
- 此函数必须返回一个长度为 $1$ 或 $N$ 的非负整数序列,表示选手 $(r, i)$ 根据参数 $A, B$ 中的信息所采取的行动。如果返回的序列长度不是 $1$ 或 $N$,则提交被判定为 Wrong Answer [1]。
- 要回答 $X$ 的值为 $x$,此函数必须返回一个长度为 $1$ 的序列,即 $(x)$。如果回答的值不正确,提交被判定为 Wrong Answer [2]。
- 如果不给出答案,此函数必须返回一个长度为 $N$ 的序列 $B'$。
- 对于每个 $j = 0, 1, \dots, N - 1$,$B'[j]$ 表示选手 $(r, i)$ 发送给选手 $(r+1, j)$ 的整数 $B_{r+1, j, i}$。它必须是 $0$ 到 $2^{64}-1$ 之间的整数。注意,即使在 $r = R-1$ 且选手 $(r+1, j)$ 不存在时,$B'$ 的长度仍必须为 $N$。
- 在第 $R-1$ 轮结束时,至少有一名选手必须给出答案。如果没有选手给出答案,提交被判定为 Wrong Answer [3]。
- 此函数的返回值必须仅由其参数决定。特别注意,返回值不得依赖于之前对
strategy的调用或运行时随机性。如果此函数对相同的参数返回不同的值,提交被判定为 Wrong Answer [4]。 - 保证给定的参数在通过某种表格 $A$ 和提交的函数策略进行游戏时确实可能发生。但是,请注意,调用不一定按第 $0, 1, \dots, R-1$ 轮的顺序进行。
- 评测机将在单次执行中进行一场或多场游戏。在单次执行中,此函数最多被调用 $10\,240$ 次。
说明
- 你可以自由实现其他函数或声明全局变量以供内部使用。
- 你提交的程序不得以任何方式与标准输入、标准输出或任何其他文件通信。但是,允许将调试信息等输出到标准错误输出。
数据范围
- $2 \le N \le 256$。
- $0 \le A_{i,j} < 2^{48}$($0 \le i \le N - 1, 0 \le j \le N - 1$)。
- $A_{i,i} = 0$($0 \le i \le N - 1$)。
- $A_{i,j} = A_{j,i}$($0 \le i < j \le N - 1$)。
- $N$ 和 $A_{i,j}$($0 \le i \le N - 1, 0 \le j \le N - 1$)均为整数。
子任务
- (5 分) $N \le 64, A_{i,j} \le 1$($0 \le i \le N - 1, 0 \le j \le N - 1$)。
- (10 分) $A_{i,j} \le 1$($0 \le i \le N - 1, 0 \le j \le N - 1$)。
- (15 分) $N \le 64$。
- (40 分) $A_{i,j} < 2^{20}$($0 \le i \le N - 1, 0 \le j \le N - 1$)。
- (15 分) $A_{i,j} < 2^{40}$($0 \le i \le N - 1, 0 \le j \le N - 1$)。
- (15 分) 无附加限制。
评分
如果在子任务的测试用例中,即使有一个被判定为 Wrong Answer [1]–[4]、Time Limit Exceeded、Memory Limit Exceeded 或 Runtime Error,该子任务的得分也为 0。否则,令 $S$ 为该子任务中所有游戏所使用的最大轮数。则该子任务的得分确定如下:
对于子任务 3:
- 无论 $S$ 的值如何,该子任务的得分均为该子任务分数的 100%。如果 $S > 6$,竞赛网站可能会显示“输出部分正确”,但这不影响得分。
对于子任务 3 以外的子任务:
- 如果 $S \le 6$,该子任务的得分均为该子任务分数的 100%。
- 如果 $7 \le S \le 9$,该子任务的得分均为该子任务分数的 $(100 - 20 \cdot (S - 6))\%$。
- 如果 $10 \le S \le 19$,该子任务的得分均为该子任务分数的 $(40 - S)\%$。
- 如果 $20 \le S$,该子任务的得分均为该子任务分数的 20%。
样例
样例输入 1
1 3 1 2 3
样例输出 1
Accepted: 2
说明 1
以下是样例评测机读取的输入以及相应的函数调用序列:
调用 strategy |
返回值 |
|---|---|
strategy(3, 0, 0, [0, 1, 2], [0, 0, 0]) |
[0, 1, 2] |
strategy(3, 0, 1, [1, 0, 3], [0, 0, 0]) |
[3, 4, 5] |
strategy(3, 0, 2, [2, 3, 0], [0, 0, 0]) |
[6, 7, 8] |
strategy(3, 1, 0, [0, 1, 2], [0, 3, 6]) |
[3] |
在第 0 轮中,发生以下交互: 选手 $(0, 0)$ 没有回答 $X$ 的值,并向选手 $(1, 0)$ 发送 $B_{1,0,0} = 0$,向选手 $(1, 1)$ 发送 $B_{1,1,0} = 1$,向选手 $(1, 2)$ 发送 $B_{1,2,0} = 2$。 选手 $(0, 1)$ 没有回答 $X$ 的值,并向选手 $(1, 0)$ 发送 $B_{1,0,1} = 3$,向选手 $(1, 1)$ 发送 $B_{1,1,1} = 4$,向选手 $(1, 2)$ 发送 $B_{1,2,1} = 5$。 * 选手 $(0, 2)$ 没有回答 $X$ 的值,并向选手 $(1, 0)$ 发送 $B_{1,0,2} = 6$,向选手 $(1, 1)$ 发送 $B_{1,1,2} = 7$,向选手 $(1, 2)$ 发送 $B_{1,2,2} = 8$。
由于没有选手回答 $X$ 的值,游戏进入下一轮。
在第 1 轮中,发生以下交互: * 选手 $(1, 0)$ 从选手 $(0, 0)$ 接收到 $B_{1,0,0} = 0$,从选手 $(0, 1)$ 接收到 $B_{1,0,1} = 3$,从选手 $(0, 2)$ 接收到 $B_{1,0,2} = 6$,并回答 $X = 3$。由于 $X$ 的值已被回答,游戏在此时结束。
因为回答的 $X$ 值正确,游戏成功。该游戏使用的轮数为 2。此样例输入满足子任务 3、4、5 和 6 的限制。