#P11942. [KTSC 2025] 重塑矩阵 / grid_encoding

    ID: 13330 远端评测题 3000ms 1024MiB 尝试: 0 已通过: 0 难度: 6 上传者: 标签>2025交互题Special Judge通信题KOI(韩国)

[KTSC 2025] 重塑矩阵 / grid_encoding

题目背景

版权信息:译自 2025年度 国际情报 올림피아드 (Olympiad) 代表学生 选拔考试 R1T1。[CC BY-NC-SA 4.0]


由于洛谷评测系统的限制,本题将仅执行一次。请注意多测清空。

使用全局变量来达成「绕过交互库传递信息,以获取大于 00 分」的目的,将被视为作弊。

你需要在文件头加入以下内容:

void select(int x, int y);

题目描述

这是一道通信题。交互库是非自适应(non-adaptive)的。 本题中,下标默认为 0-index\textsf{0-index}

Alice 有一个 n×nn\times n0101 矩阵 AA,满足以下条件:

  • 不存在 0i1<i2<n0\le i_1\lt i_2\lt n0j1<j2<n0\le j_1\lt j_2\lt n 使得 $\textcolor{red}{A_{i_1,j_1}=A_{i_2,j_2},A_{i_1,j_2}=A_{i_2,j_1},A_{i_1,j_1}\neq A_{i_1,j_2}}$ 均成立。

Alice 要把这个矩阵传递给 Bob。出于安全考虑,通信程序如下:

  • Alice 从 n2n^2 个元素中选择若干个;
  • 交互库有两个隐藏的 0n10\sim n-1 的排列 p,qp,q
  • Bob 会得到一个 n×nn\times n 的矩阵 B。对于 Alice 选择的每个元素 (i,j)(i,j),都有 Bpi,qj=Ai,jB_{p_i,q_j}=A_{i,j};对于未选择的 (i,j)(i,j),有 Bpi,qj=1B_{p_i,q_j}=-1

Bob 要将 BB 矩阵中的 1-10011 填充,使得 0i,j<n\forall 0\le i,j\lt n,都有 Bpi,qj=Ai,jB_{p_i,q_j}=A_{i,j} 成立。

实现细节

这是一道通信题。交互库是非自适应(non-adaptive)的。

你不需要,也不应该实现 main 函数。禁止访问标准输入/输出流(stdinstdout)。

你需要在文件头加入以下内容:

void select(int x, int y);

你可以调用以下的函数:

void select(int i, int j);
  • 你需要保证 0i,j<n0\le i,j\lt n
  • 令该函数被调用的总次数kk

你需要实现以下的函数:

void send(vector<vector<int>> A);
  • 参数 A:一个长度为 nn 的二维 vector,其中每个元素都是一个长度为 nnvector<int>
  • 在这个函数中,你应当调用 select 函数选择你想要传输的元素。
    • 调用 select 的次数不得超过 n2n^2
vector<vector<int>> reconstruct(vector<vector<int>> B);

对于 send 中给定的矩阵 AA,这里参数 B 满足以下条件:

  • B 是和 A 形状相同的二维 vector
  • p,qp,q 是交互库中隐藏的 0n10\sim n-1 的排列;
  • 0i,j<n\forall 0\le i,j\lt n
    • 若调用过 select(i,j),则 Bpi,qj=Ai,jB_{p_i,q_j}=A_{i,j}
    • 否则,Bpi,qj=1B_{p_i,q_j}=-1
  • 返回值 C 必须满足:
    • 0i,j<n\forall 0\le i,j\lt n,都有 Cpi,qj=Ai,jC_{p_i,q_j}=A_{i,j} 成立。

注意事项

  • send 中对 select 的调用,以及 reconstruct 的返回值应当只依赖于给定参数的值。若以相同参数多次调用时行为不一致,则会被判定为 Wrong Answer\text{Wrong Answer}
  • 在交互库中,排列 p,qp,q预先确定的非适应性的。但是你无法直接访问它们。
    • 在 Sample Grader 中,p,qp,q 会作为输入给出。
  • 每个测试点中含有多组独立的测试数据,每组数据会依次调用 sendreconstruct 恰好一次。
    • 我们不保证每组数据都按顺序运行,但保证函数调用及返回值的逻辑符合题目描述。
  • 实际使用的 Grader 与 Sample Grader 的行为不同。请勿依赖 Sample Grader 的特定行为。
  • 本题用时定义为 sendreconstruct 用时之和,内存使用量不大于两者使用的峰值内存之和。

输入格式

本题单个测试点内含有多组测试数据。

Sample Grader 输入格式如下:

nn
A0,0A_{0,0} A0,1A_{0,1} \cdots A0,n1A_{0,n-1}
A1,0A_{1,0} A1,1A_{1,1} \cdots A1,n1A_{1,n-1}
\vdots
An1,0A_{n-1,0} An1,1A_{n-1,1} \cdots An1,n1A_{n-1,n-1}
p0p_0 p1p_1 \cdots pn1p_{n-1}
q0q_0 q1q_1 \cdots qn1q_{n-1}

输出格式

Sample Grader 输出格式如下:

  1. 如果调用了不满足 0i,jn10 \leq i, j \leq n-1select(i, j),则输出一行 Wrong Answer [1]
  2. 如果 select 的调用总次数 kk 超过 n2n^2,则输出一行 Wrong Answer [2]
  3. 如果 reconstruct 的返回值 CC 的维度或元素数量与 BB 不一致,则输出一行 Wrong Answer [3]
  4. 如果 CC 未满足条件 Cpi,qj=Ai,jC_{p_i,q_j}=A_{i,j},则输出一行 Wrong Answer [4]
  5. 以上错误均未发生时,输出调用 select 的次数,格式为 k: 10

若检测到错误(输出任何 Wrong Answer),示例评测系统将立即终止运行。

注意:实际使用的 Grader 与 Sample Grader 的行为不同。请勿依赖 Sample Grader 的特定行为。

3
1 1 1
1 1 0
0 1 0
2 1 0
0 1 2
k: 4

提示

样例交互 11

n=3n=3,$A=\begin{bmatrix}1 & 1 & 1 \\1 & 1 & 0 \\ 0 & 1 & 0\end{bmatrix}$,p=[2,1,0]p=[2,1,0]q=[0,1,2]q=[0,1,2]

交互库调用 send

send([1, 1, 1], [1, 1, 0], [0, 1, 0])

send 调用 select 函数:

select(0,1)
select(0,2)
select(1,0)
select(2,2)

随后交互库调用 reconstruct 函数:

reconstruct([[-1, -1, 0], [1, -1, -1], [-1, 1, 1]])

reconstruct 函数返回 [[0, 1, 0], [1, 1, 0], [1, 1, 1]],被判定为 Accepted\text{Accepted}

数据范围

  • 1n5001\le n\le 500
  • n2106\sum n^2\le 10^6

子任务

  • Subtask 0 (0 pts)\text{Subtask 0 (0 pts)}:样例。

  • Subtask 1 (12 pts)\text{Subtask 1 (12 pts)}

    • 0i,j<n\forall 0\le i,j\lt nAi,j=1    ijA_{i,j}=1\iff i\le j
  • Subtask 2 (35 pts)\text{Subtask 2 (35 pts)}

    • 这个矩阵形如直方图(히스토그램 형태,histogram structure)。
    • 换言之,0j<n\forall 0\le j\lt n,存在 0hjn0\le h_j\le n,使得 Ai,j=1    i<HjA_{i,j}=1\iff i\lt H_j
  • Subtask 3 (53 pts)\text{Subtask 3 (53 pts)}:无额外约束。

计分方式

如果返回值 C 不满足:

  • 0i,j<n\forall 0\le i,j\lt n,都有 Cpi,qj=Ai,jC_{p_i,q_j}=A_{i,j} 成立。

那么该测试点得 00 分。

  1. 若每组测试数据都有 k2n1k\le 2n-1,该测试点得满分。
  2. 否则,令 c=max{k/n}c=\max \{k/n\}。若 c10c\le 10,得 (1109c)/100(110-9c)/100 倍测试点满分。
  3. 否则,若 kn2/2+1k\le n^2/2+1,则得 7/1007/100 倍测试点满分。
  4. 否则,该测试点得 00 分。

每个子任务得分为该子任务内测试点得分最小值向下取整。