P14395 [JOISC 2016] 神经衰弱 / Memory2

题目背景

翻译参考自 [LibreOJ](https://loj.ac/p/2730)。

题目描述

有 $2N$ 张卡片,每张卡片正面写有一个 $0$ 到 $N-1$ 之间的整数,且每个整数恰好出现两次。你和 JOI 君正在使用这 $2N$ 张卡片进行名为“神经衰弱”的游戏练习。 游戏练习开始时,所有卡片背面朝上,横向排成一列放在桌面上。从左往右第 $i+1$ 张卡片($0 \le i \le 2N-1$)称为卡片 $i$,其正面所写的整数记为 $A_i$($0 \le i \le 2N-1$)。最初,你和 JOI 君都不知道 $A_i$($0 \le i \le 2N-1$)的具体数值。 你和 JOI 君最多可以重复进行 $K$ 轮如下操作: 1. 你指定 $2N$ 张卡片中的任意两张卡片。 2. JOI 君将这两张卡片翻面,但确保你无法看到卡片正面所写的整数。如果两张卡片正面所写的整数相等,JOI 君会记住这个值并告诉你;否则,他会从两张卡片正面所写的整数中,选择一个对他而言更容易记住的值告诉你。 JOI 君对整数的记忆难度由 $N$ 个整数 $P_0, P_1, \dots, P_{N-1}$ 表示,这些整数满足以下两个条件: - $0 \le P_i \le N-1$($0 \le i \le N-1$)。 - $P_i \ne P_j$($0 \le i < j \le N-1$)。 对 JOI 君而言,整数 $i$ 比整数 $j$ 更容易记住,当且仅当 $P_i < P_j$ 成立。 你的任务是:通过与 JOI 君进行最多 $K$ 轮操作,确定每张卡片正面所写的整数。但你并不知道 JOI 君用于表示记忆难度的整数 $P_0, P_1, \dots, P_{N-1}$ 的具体取值。 **题目** 请编写一个程序,通过与 JOI 君进行交互操作,确定每张卡片正面所写的整数。 ### 实现细节 你需要写一个程序实现确定每张牌上写的数字的功能。你不需要引入外部头文件,但是你必须声明函数 `int Flip(int I, int J);` 和 `void Answer(int I, int J, int X);`。并且,你应当选择不低于 C++17 的语言标准提交。 程序中必需实现以下函数: - $\texttt{void Solve(int T, int N)}$ 对于每组测试数据,这个函数仅调用一次。$T$ 代表子任务编号,$N$ 代表有 $2N$ 张牌。 这个函数必需通过调用 $\texttt{Flip}$ 函数来确定牌上写的数字,通过调用 $\texttt{Answer}$ 函数来做出回答。 程序中可以调用以下函数: - $\texttt{int Flip(int I, int J)}$ 当指定 JOI 君翻哪两张牌时调用这个函数。参数 $\texttt{I, J}$ 表示 JOI 君需要翻开纸牌 $I$ 和 $J$。 $I$ 和 $J$ 都必须是 $0$ 到 $2N-1$(包括两端)的整数,并且 $I$ 不等于 $J$。如果调用 $\texttt{Flip}$ 函数时不满足条件,则会被判为 **Wrong answer [1]**。 如果 $A_I=A_J$,则这个函数返回这个值,否则会返回 $A_I$ 和 $A_J$ 中更容易记住的那个值。 如果这个函数调用超过 $K$ 次,则会被判为 **Wrong answer [2]**。 - $\texttt{void Answer(int I, int J, int X)}$ 这个函数表示写有整数 $X$ 的卡片可以被确定了。 参数 $\texttt{I, J, X}$ 需要满足以下条件: - $0\le I,J\le 2N-1$ - $I\neq J$ - $A_I=A_J=X$ 如果调用时参数不满足以上条件,则会被判为 **Wrong answer [3]**。 调用时,参数 $X$ 的值需要与先前任意调用中的 $X$ 不同。如果不满足,则会被判为 **Wrong answer [4]**。 此函数必须恰好被调用 $N$ 次,否则会被判为 **Wrong answer [5]**。 你的程序可以实现任何其他函数,或定义全局变量。但你的程序无论如何都不可以与标准输入输出或其他文件交互。 附加文件中包含一个样例交互器和交互库,仅用作测试。 样例交互器包含一个文件,文件名为 `grader.c` 或 `grader.cpp`。为了测试程序,需执行如下命令: - C 语言 ```bash gcc -std=c11 -O2 -o grader grader.c Memory2.c -lm ``` - C++ 语言 ```bash g++ -std=c++11 -O2 -o grader grader.cpp Memory2.cpp ``` 如果编译成功,则会生成一个名为 `grader` 的可执行文件。 请注意,实际判题过程和样例的判题过程不同。样例判题程序作为单进程执行。这个程序需要从标准输入中读入,并输出到标准输出中。

输入格式

第一行三个整数 $T,N,K$,由一个空格隔开。分别表示子任务编号为 $T$,有 $2N$ 张牌,和 JOI 君最多问答 $K$ 次。 第二行 $N$ 个整数 $P_0,P_1,\ldots ,P_{N-1}$,表示 JOI 君对整数的记忆力。 第三行 $2N$ 个整数 $A_0,A_1,\ldots,A_{2N-1}$,表示从左到右纸牌上写的整数。

输出格式

如果样例交互程序正常退出,它会向标准输出输出一行如下内容: - 如果答案正确,输出 `Accepted`。 - 如果不正确,输出错误的类型,如 `Wrong answer [2]`。

说明/提示

### 样例交互 样例交互过程如下 | 函数调用 | 返回值 | | :------------------------: | :---------: | | $\texttt{Flip(0, 2)}$ | $\texttt 1$ | | $\texttt{Flip(0, 4)}$ | $\texttt 1 $ | | $\texttt{Flip(1, 2)}$ | $\texttt 0$ | | $\texttt{Answer(0, 4, 1)}$ | | | $\texttt{Flip(1, 3)}$ | $\texttt 0$ | | $\texttt{Flip(5, 2)}$ | $\texttt 2$ | | $\texttt{Flip(4, 5)}$ | $\texttt 1$ | | $\texttt{Answer(1, 3, 0)}$ | | | $\texttt{Answer(5, 2, 2)}$ | $\tt 0$ | ### 数据范围 所有输入数据满足以下条件: - $1 \le N \le 50$。 - $0 \le P_i \le N-1$($0 \le i \le N-1$)。 - $P_i \ne P_j$($0 \le i < j \le N-1$)。 - $0 \le A_i \le N-1$($0 \le i \le 2N-1$)。 - 对于任意 $x$($0 \le x \le N-1$),恰好存在两个 $i$($0 \le i \le 2N-1$)满足 $A_i = x$。 ### 子任务 **子任务 1 [10 分]** 满足以下条件: - $T = 1$。 - $K = 10\,000$。 - $P_i = i$($0 \le i \le N-1$)。 **子任务 2 [50 分]** 满足以下条件: - $T = 2$。 - $K = 400$。 - $P_i = i$($0 \le i \le N-1$)。 **子任务 3 [40 分]** 满足以下条件: - $T = 3$。 - $K = 300$。 翻译由 Qwen3-235B 完成