P11942 [KTSC 2025] 重塑矩阵 / grid_encoding

题目背景

版权信息:译自 [2025年度 国际情报 올림피아드 (Olympiad) 代表学生 选拔考试](https://www.ioikorea.or.kr/archives/ioitst/2025/) R1T1。[[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)] --- 由于洛谷评测系统的限制,本题将仅执行一次。请注意多测清空。 **使用全局变量来达成「绕过交互库传递信息,以获取大于 $0$ 分」的目的,将被视为作弊。** 你需要在文件头加入以下内容: ```cpp void select(int x, int y); ```

题目描述

**这是一道通信题。交互库是非自适应(non-adaptive)的。** 本题中,下标默认为 $\textsf{0-index}$。 Alice 有一个 $n\times n$ 的 $01$ 矩阵 $A$,满足以下条件: - **不存在** $0\le i_1\lt i_2\lt n$,$0\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 从 $n^2$ 个元素中选择若干个; - 交互库有两个隐藏的 $0\sim n-1$ 的排列 $p,q$; - Bob 会得到一个 $n\times n$ 的矩阵 B。对于 Alice 选择的每个元素 $(i,j)$,都有 $B_{p_i,q_j}=A_{i,j}$;对于未选择的 $(i,j)$,有 $B_{p_i,q_j}=-1$。 Bob 要将 $B$ 矩阵中的 $-1$ 用 $0$ 或 $1$ 填充,使得 $\forall 0\le i,j\lt n$,都有 $B_{p_i,q_j}=A_{i,j}$ 成立。 ### 实现细节 **这是一道通信题。交互库是非自适应(non-adaptive)的。** 你不需要,也不应该实现 main 函数。禁止访问标准输入/输出流(`stdin`,`stdout`)。 你需要在文件头加入以下内容: ```cpp void select(int x, int y); ``` 你可以调用以下的函数: ```cpp void select(int i, int j); ``` - 你需要保证 $0\le i,j\lt n$。 - 令该函数被调用的**总次数**为 $k$。 你需要实现以下的函数: ```cpp void send(vector A); ``` - 参数 `A`:一个长度为 $n$ 的二维 `vector`,其中每个元素都是一个长度为 $n$ 的 `vector`。 - 在这个函数中,你应当调用 `select` 函数选择你想要传输的元素。 - 调用 `select` 的次数不得超过 $n^2$。 ```cpp vector reconstruct(vector B); ``` 对于 `send` 中给定的矩阵 $A$,这里参数 `B` 满足以下条件: - `B` 是和 `A` 形状相同的二维 `vector`; - $p,q$ 是交互库中隐藏的 $0\sim n-1$ 的排列; - $\forall 0\le i,j\lt n$: - 若调用过 `select(i,j)`,则 $B_{p_i,q_j}=A_{i,j}$; - 否则,$B_{p_i,q_j}=-1$。 - 返回值 `C` 必须满足: - $\forall 0\le i,j\lt n$,都有 $C_{p_i,q_j}=A_{i,j}$ 成立。 ### 注意事项 - `send` 中对 `select` 的调用,以及 `reconstruct` 的返回值**应当只依赖于给定参数的值**。若以相同参数多次调用时行为不一致,则会被判定为 $\text{Wrong Answer}$。 - 在交互库中,排列 $p,q$ 是**预先确定的**,**非适应性的**。但是你无法直接访问它们。 - 在 Sample Grader 中,$p,q$ 会作为输入给出。 - **每个测试点中含有多组独立的测试数据**,每组数据会依次调用 `send` 和 `reconstruct` 恰好一次。 - 我们不保证每组数据都按顺序运行,但保证函数调用及返回值的逻辑符合题目描述。 - 实际使用的 Grader 与 Sample Grader 的行为不同。请勿依赖 Sample Grader 的特定行为。 - 本题用时定义为 `send` 和 `reconstruct` 用时之和,内存使用量不大于两者使用的峰值内存之和。

输入格式

**本题单个测试点内含有多组测试数据。** Sample Grader 输入格式如下: > $n$\ > $A_{0,0}$ $A_{0,1}$ $\cdots$ $A_{0,n-1}$\ > $A_{1,0}$ $A_{1,1}$ $\cdots$ $A_{1,n-1}$\ > $\vdots$ \ > $A_{n-1,0}$ $A_{n-1,1}$ $\cdots$ $A_{n-1,n-1}$\ > $p_0$ $p_1$ $\cdots$ $p_{n-1}$\ > $q_0$ $q_1$ $\cdots$ $q_{n-1}$

输出格式

Sample Grader 输出格式如下: 1. 如果调用了不满足 $0 \leq i, j \leq n-1$ 的 `select(i, j)`,则输出一行 `Wrong Answer [1]`。 2. 如果 `select` 的调用总次数 $k$ 超过 $n^2$,则输出一行 `Wrong Answer [2]`。 3. 如果 `reconstruct` 的返回值 $C$ 的维度或元素数量与 $B$ 不一致,则输出一行 `Wrong Answer [3]`。 4. 如果 $C$ 未满足条件 $C_{p_i,q_j}=A_{i,j}$,则输出一行 `Wrong Answer [4]`。 5. 以上错误均未发生时,输出调用 `select` 的次数,格式为 `k: 10`。 若检测到错误(输出任何 `Wrong Answer`),示例评测系统将立即终止运行。 **注意:实际使用的 Grader 与 Sample Grader 的行为不同。请勿依赖 Sample Grader 的特定行为。**

说明/提示

#### 样例交互 $1$ $n=3$,$A=\begin{bmatrix}1 & 1 & 1 \\1 & 1 & 0 \\ 0 & 1 & 0\end{bmatrix}$,$p=[2,1,0]$,$q=[0,1,2]$。 交互库调用 `send`: ```cpp send([1, 1, 1], [1, 1, 0], [0, 1, 0]) ``` `send` 调用 `select` 函数: ```cpp select(0,1) select(0,2) select(1,0) select(2,2) ``` 随后交互库调用 `reconstruct` 函数: ```cpp reconstruct([[-1, -1, 0], [1, -1, -1], [-1, 1, 1]]) ``` `reconstruct` 函数返回 `[[0, 1, 0], [1, 1, 0], [1, 1, 1]]`,被判定为 $\text{Accepted}$。 ### 数据范围 - $1\le n\le 500$。 - $\sum n^2\le 10^6$。 ### 子任务 - $\text{Subtask 0 (0 pts)}$:样例。 - $\text{Subtask 1 (12 pts)}$。 - $\forall 0\le i,j\lt n$,$A_{i,j}=1\iff i\le j$。 - $\text{Subtask 2 (35 pts)}$。 - 这个矩阵形如直方图(히스토그램 형태,histogram structure)。 - 换言之,$\forall 0\le j\lt n$,存在 $0\le h_j\le n$,使得 $A_{i,j}=1\iff i\lt H_j$。 - $\text{Subtask 3 (53 pts)}$:无额外约束。 ### 计分方式 如果返回值 `C` 不满足: - $\forall 0\le i,j\lt n$,都有 $C_{p_i,q_j}=A_{i,j}$ 成立。 那么该测试点得 $0$ 分。 1. 若每组测试数据都有 $k\le 2n-1$,该测试点得满分。 2. 否则,令 $c=\max \{k/n\}$。若 $c\le 10$,得 $(110-9c)/100$ 倍测试点满分。 3. 否则,若 $k\le n^2/2+1$,则得 $7/100$ 倍测试点满分。 4. 否则,该测试点得 $0$ 分。 每个子任务得分为该子任务内测试点得分最小值向下取整。