#P14169. [JOI Final 2026] 多方通信 2 / Multi Communication 2

    ID: 13376 传统题 2000ms 1024MiB 尝试: 2 已通过: 1 难度: 9 上传者: 标签>CF2800图论最小生成树并查集构造模拟分治递归

[JOI Final 2026] 多方通信 2 / Multi Communication 2

题目描述

K 会长为 JOI 决赛的选手们准备了一个游戏。K 会长秘密地拥有一张 N×NN \times N 的表格 AA,表格中的每个单元格都包含一个非负整数。令 Ai,jA_{i,j} 表示写在从上数第 (i+1)(i + 1) 行(0iN10 \leq i \leq N - 1)且从左数第 (j+1)(j + 1) 列(0jN10 \leq j \leq N - 1)单元格中的整数。表格 AA 满足以下条件:

  • 对于每个满足 0iN10 \leq i \leq N - 1ii,都有 Ai,i=0A_{i,i} = 0
  • 对于每个满足 0i<jN10 \leq i < j \leq N - 1i,ji,j,都有 Ai,j=Aj,iA_{i,j} = A_{j,i}

考虑一个具有 NN 个顶点的加权无向图,其中顶点 ii 和顶点 jj0i<jN10 \leq i < j \leq N - 1)之间的边权重为 Ai,jA_{i,j}。令 XX 为该图的最小生成树权重。换句话说,XX 是通过以下过程获得的值。游戏的目标是让所有选手合作并确定 XX 的值。

  1. 设置 x=0x = 0
  2. 考虑一个具有 NN 个顶点的无向图 GGGG 的顶点编号为 0,1,,N10, 1, \dots, N-1。初始时,GG 没有边。
  3. 重复以下操作 N1N - 1 次。令 XX 为这 N1N - 1 次操作后的 xx 值。 i. 将当前从顶点 00 通过某些边可达的 GG 的顶点称为近端顶点,将其他顶点称为远端顶点。选择一对由近端顶点 ii 和远端顶点 jj 组成的二元组 (i,j)(i, j),使得 Ai,j×N2+i×N+jA_{i,j} \times N^{2} + i \times N + j 的值最小。可以证明,至少存在一个近端顶点和一个远端顶点,并且 (i,j)(i, j) 是唯一确定的。 ii. 在 GG 中添加连接顶点 ii 和顶点 jj 的边。 iii. 更新 xx+Ai,jx \leftarrow x + A_{i,j}

定义 R=5120/NR = \lfloor 5120 / N \rfloor(其中 x\lfloor x \rfloor 表示不超过 xx 的最大整数)。JOI 决赛共有 R×NR \times N 名选手,分为 RR 个小组,每组 NN 名选手。小组编号为 00R1R-1,小组 rr0rR10 \leq r \leq R - 1)中的选手编号为 (r,0),(r,1),,(r,N1)(r,0), (r,1), \dots, (r, N-1)

游戏通过按顺序重复以下回合进行:回合 0,1,2,0, 1, 2, \dots,最多进行 RR 次。在游戏过程中,选手之间不允许交流,但他们可以提前商定策略。

回合 rr0rR10 \leq r \leq R - 1)按如下方式进行:

  • 按照 i=0,1,,N1i = 0, 1, \dots, N - 1 的顺序,K 会长与选手 (r,i)(r, i) 进行以下交互。
    1. K 会长给予选手 (r,i)(r, i) 以下信息:
      • 该选手的编号 (r,i)(r, i)
      • 表格 AA(i+1)(i + 1) 行的信息,即 Ai,0,Ai,1,,Ai,N1A_{i,0}, A_{i,1}, \dots, A_{i,N-1}
      • 整数 Br,i,0,Br,i,1,,Br,i,N1B_{r,i,0}, B_{r,i,1}, \dots, B_{r,i,N-1},其中每一个都是介于 0026412^{64} - 1 之间(含)的整数,由上一回合的选手发送给选手 (r,i)(r, i)
        • 如果 r>0r > 0,这些整数由下文描述的交互 3 确定。
        • 如果 r=0r = 0,为了方便起见,我们定义 Br,i,0=Br,i,1==Br,i,N1=0B_{r,i,0} = B_{r,i,1} = \dots = B_{r,i,N-1} = 0
    2. 如果选手 (r,i)(r, i) 能够确定 XX 的值,他们向 K 会长回答该值。如果任何选手给出了答案,游戏立即结束。
    3. 对于每个 j=0,1,,N1j = 0, 1, \dots, N - 1,选手 (r,i)(r, i) 确定一个整数 Br+1,j,iB_{r+1,j,i}(必须在 0026412^{64} - 1 之间,含),发送给选手 (r+1,j)(r + 1, j),并将其告知 K 会长。即使当 r=R1r = R - 1 导致选手 (r+1,j)(r + 1, j) 不存在时,选手 (r,i)(r, i) 仍必须确定 Br+1,j,iB_{r+1,j,i} 并告知 K 会长。

如果回答的 XX 值不正确,或者到回合 R1R - 1 结束时仍没有人回答 XX 的值,则游戏失败。如果在回合 R1R - 1 结束前回答了正确的 XX 值,则游戏成功。使用的回合数越少,得分越高(如果在回合 rr 给出答案,回合数计为 r+1r + 1)。

请为选手们实现一种策略,使游戏以尽可能少的回合数成功。

实现细节

你的提交必须使用 #include 预处理指令包含 multi.h,并且必须实现以下函数。

std::vector<unsigned long long> strategy(int N, int r, int i, std::vector<unsigned long long> A, std::vector<unsigned long long> B)
  • 参数 NN 代表表格 AA 的行数和列数。

  • 参数 rrii 代表选手编号 (r,i)(r,i)

  • 参数 AA 是一个长度为 NN 的非负整数序列,其中 A[j]A[j]0jN10 \leq j \leq N-1)代表写在表格 AA 从上数第 (i+1)(i+1) 行、从左数第 (j+1)(j+1) 列单元格中的整数 Ai,jA_{i,j}

  • 参数 BB 是一个长度为 NN 的非负整数序列,其中 B[j]B[j]0jN10 \leq j \leq N-1)代表从选手 (r1,j)(r-1,j) 发送给选手 (r,i)(r,i) 的整数 Br,i,jB_{r,i,j}。如果 r=0r=0,则 B[j]=0B[j]=0

  • 该函数必须返回一个长度为 11NN 的非负整数序列,代表选手 (r,i)(r,i) 根据参数 A,BA, B 中的信息所采取的行动。如果返回的序列长度不是 11NN,提交将被评定为 Wrong Answer [1]

  • 要回答 XX 的值为 xx,该函数必须返回一个长度为 11 的序列,即 (x)(x)。如果回答的值不正确,提交将被评定为 Wrong Answer [2]

  • 如果不给出回答,该函数必须返回一个长度为 NN 的序列 BB'

    • 对于每个 j=0,1,,N1j=0,1,\dots,N-1B[j]B'[j] 代表由选手 (r,i)(r,i) 发送给选手 (r+1,j)(r+1,j) 的整数 Br+1,j,iB_{r+1,j,i}。它必须是介于 0026412^{64}-1 之间(含)的整数。请注意,即使当 r=R1r=R-1 且选手 (r+1,j)(r+1,j) 不存在时,BB' 的长度仍必须为 NN
  • 在回合 R1R-1 结束前,至少要有一名选手给出回答。如果没有选手给出回答,提交将被评定为 Wrong Answer [3]

  • 该函数的返回值必须仅由其参数决定。特别注意,返回值不得依赖于之前对 strategy 的调用或运行时的随机性。如果该函数对相同的参数返回不同的值,提交将被评定为 Wrong Answer [4]

  • 保证给定的参数在利用某个表格 AA 和提交的函数 strategy 进行游戏时确实可能发生。但是,请注意,调用不一定按照回合 0,1,,R10,1,\dots,R-1 的顺序进行。

  • 评分程序将在单次执行中进行一场或多场游戏。在一次执行中,该函数最多被调用 1024010240 次。

重要注意事项

  • 你可以自由实现其他函数或声明全局变量以供内部使用。
  • 你提交的程序不得以任何方式与标准输入、标准输出或任何其他文件进行通信。但是,允许向标准错误输出输出调试信息等。

编译与测试运行

用于测试程序的样例评分程序包含在可从竞赛网站下载的压缩包中。该压缩包还包含你必须提交的样例文件。

样例评分程序由单个文件组成,即 grader.cpp。要测试你的程序,请将文件 grader.cppmulti.cppmulti.h 放在同一目录下,并执行以下命令。

g++ -std=gnu++20 -O2 -o grader grader.cpp multi.cpp

或者,你可以执行压缩包中包含的 compile.sh 文件。在这种情况下,运行以下命令。

./compile.sh

如果编译成功,将生成一个名为 grader 的可执行文件。

请注意,用于评测的实际评分程序与样例评分程序不同。样例评分程序以单进程运行。该程序从标准输入读取输入,并将结果写入标准输出。

输入格式

样例评分程序在单次执行中进行一场或多场游戏。

首先,样例评分程序从标准输入读取游戏数量 TT。然后,对于 TT 场游戏中的每一场,它按以下格式读取表格 AA 的信息。

NN
A0,1 A0,2 A0,3  A0,N1A_{0,1} \ A_{0,2} \ A_{0,3} \ \cdots \ A_{0,N-1}
A1,2 A1,3  A1,N1A_{1,2} \ A_{1,3} \ \cdots \ A_{1,N-1}
\vdots
AN2,N1A_{N-2,N-1}

输出格式

样例评分程序向标准输出输出 TT 行。在第 tt 行(1tT1 \le t \le T),它按以下格式输出第 tt 场游戏的结果(引号实际上不会被打印)。

  • 如果游戏成功,则输出该游戏使用的回合数,如 Accepted: 22
  • 如果触发了任何 Wrong Answer 条件,则输出 Wrong Answer 的类型,如 Wrong Answer [4]

如果执行的程序满足多个 Wrong Answer 条件,则仅显示其中之一。

说明/提示

样例交互

以下是样例评分程序读取的输入示例以及相应的函数调用序列。

输入

1
3
1 2
3
调用 strategy 返回值
$\texttt{strategy(3,\,0,\,0,\,[0,\,1,\,2],\,[0,\,0,\,0])}$ [0,1,2]\texttt{[0,\,1,\,2]}
$\texttt{strategy(3,\,0,\,1,\,[1,\,0,\,3],\,[0,\,0,\,0])}$ [3,4,5]\texttt{[3,\,4,\,5]}
$\texttt{strategy(3,\,0,\,2,\,[2,\,3,\,0],\,[0,\,0,\,0])}$ [6,7,8]\texttt{[6,\,7,\,8]}
$\texttt{strategy(3,\,1,\,0,\,[0,\,1,\,2],\,[0,\,3,\,6])}$ [3]\texttt{[3]}

在第 00 回合中,发生了以下交互:

  • 选手 (0,0)(0,0) 没有回答 XX 的值,并向选手 (1,0)(1,0) 发送 B1,0,0=0B_{1,0,0} = 0,向选手 (1,1)(1,1) 发送 B1,1,0=1B_{1,1,0} = 1,向选手 (1,2)(1,2) 发送 B1,2,0=2B_{1,2,0} = 2
  • 选手 (0,1)(0,1) 没有回答 XX 的值,并向选手 (1,0)(1,0) 发送 B1,0,1=3B_{1,0,1} = 3,向选手 (1,1)(1,1) 发送 B1,1,1=4B_{1,1,1} = 4,向选手 (1,2)(1,2) 发送 B1,2,1=5B_{1,2,1} = 5
  • 选手 (0,2)(0,2) 没有回答 XX 的值,并向选手 (1,0)(1,0) 发送 B1,0,2=6B_{1,0,2} = 6,向选手 (1,1)(1,1) 发送 B1,1,2=7B_{1,1,2} = 7,向选手 (1,2)(1,2) 发送 B1,2,2=8B_{1,2,2} = 8

由于没有选手回答 XX 的值,游戏进入下一回合。

在第 11 回合中,发生了以下交互:

  • 选手 (1,0)(1,0) 收到来自选手 (0,0)(0,0)B1,0,0=0B_{1,0,0} = 0,来自选手 (0,1)(0,1)B1,0,1=3B_{1,0,1} = 3,以及来自选手 (0,2)(0,2)B1,0,2=6B_{1,0,2} = 6,并回答 X=3X = 3。由于回答了 XX 的值,游戏在此结束。

因为回答的 XX 值是正确的,游戏成功。该游戏使用的回合数为 22

此样例输入满足子任务 3,4,53, 4, 566 的约束条件。

在可从竞赛网站下载的文件中,sample-01-in.txt 对应于样例输入 1。 从竞赛网站下载的压缩包中还包含其他样例输入:sample-02-in.txtsample-03-in.txtsample-04-in.txtsample-02-in.txt 满足所有子任务的约束条件,sample-03-in.txt 满足子任务 3,4,53, 4, 566 的约束条件,sample-04-in.txt 满足子任务 4,54, 566 的约束条件。

约束条件

  • 2N2562 \leq N \leq 256
  • 0Ai,j<2480 \leq A_{i,j} < 2^{48} (0iN10 \leq i \leq N-1, 0jN10 \leq j \leq N-1)。
  • Ai,i=0A_{i,i}=0 (0iN10 \leq i \leq N-1)。
  • Ai,j=Aj,iA_{i,j}=A_{j,i} (0i<jN10 \leq i < j \leq N-1)。
  • NNAi,jA_{i,j} (0iN1,0jN10 \leq i \leq N-1, 0 \leq j \leq N-1) 均为整数。

子任务

子任务 分值 描述
1 55 N64N \leq 64, Ai,j1A_{i,j} \leq 1 (0iN1,0jN10 \leq i \leq N-1, 0 \leq j \leq N-1)。
2 1010 Ai,j1A_{i,j} \leq 1 (0iN1,0jN10 \leq i \leq N-1, 0 \leq j \leq N-1)。
3 1515 N64N \leq 64
4 4040 Ai,j<220A_{i,j} < 2^{20} (0iN1,0jN10 \leq i \leq N-1, 0 \leq j \leq N-1)。
5 1515 Ai,j<240A_{i,j} < 2^{40} (0iN1,0jN10 \leq i \leq N-1, 0 \leq j \leq N-1)。
6 无额外约束条件。

评分方式

如果在一个子任务的测试用例中,哪怕只有一个被评定为 Wrong Answer [1]-[4]、Time Limit Exceeded、Memory Limit Exceeded 或 Runtime Error,则该子任务的分数为 00。否则,令 SS 为该子任务所有游戏中使用的最大回合数。那么该子任务的分数确定如下:

对于子任务 3

  • 无论 SS 的值是多少,该子任务的分数均为该子任务分值的 100%。如果 S>6S > 6,竞赛网站可能会显示“Output is partially correct”,但这不影响得分。

对于子任务 3 以外的子任务

  • 如果 S6S \leq 6,该子任务的分数为该子任务分值的 100%。
  • 如果 7S97 \leq S \leq 9,该子任务的分数为该子任务分值的 (10020(S6))%(100-20 \cdot (S-6))\%
  • 如果 10S1910 \leq S \leq 19,该子任务的分数为该子任务分值的 (40S)%(40-S)\%
  • 如果 20S20 \leq S,该子任务的分数为该子任务分值的 20%。