题目背景
翻译参考自 LibreOJ。
题目描述
有 2N 张卡片,每张卡片正面写有一个 0 到 N−1 之间的整数,且每个整数恰好出现两次。你和 JOI 君正在使用这 2N 张卡片进行名为“神经衰弱”的游戏练习。
游戏练习开始时,所有卡片背面朝上,横向排成一列放在桌面上。从左往右第 i+1 张卡片(0≤i≤2N−1)称为卡片 i,其正面所写的整数记为 Ai(0≤i≤2N−1)。最初,你和 JOI 君都不知道 Ai(0≤i≤2N−1)的具体数值。
你和 JOI 君最多可以重复进行 K 轮如下操作:
- 你指定 2N 张卡片中的任意两张卡片。
- JOI 君将这两张卡片翻面,但确保你无法看到卡片正面所写的整数。如果两张卡片正面所写的整数相等,JOI 君会记住这个值并告诉你;否则,他会从两张卡片正面所写的整数中,选择一个对他而言更容易记住的值告诉你。
JOI 君对整数的记忆难度由 N 个整数 P0,P1,…,PN−1 表示,这些整数满足以下两个条件:
- 0≤Pi≤N−1(0≤i≤N−1)。
- Pi=Pj(0≤i<j≤N−1)。
对 JOI 君而言,整数 i 比整数 j 更容易记住,当且仅当 Pi<Pj 成立。
你的任务是:通过与 JOI 君进行最多 K 轮操作,确定每张卡片正面所写的整数。但你并不知道 JOI 君用于表示记忆难度的整数 P0,P1,…,PN−1 的具体取值。
题目
请编写一个程序,通过与 JOI 君进行交互操作,确定每张卡片正面所写的整数。
实现细节
你需要写一个程序实现确定每张牌上写的数字的功能。你不需要引入外部头文件,但是你必须声明函数 int Flip(int I, int J); 和 void Answer(int I, int J, int X);。并且,你应当选择不低于 C++17 的语言标准提交。
程序中必需实现以下函数:
- void Solve(int T, int N)
对于每组测试数据,这个函数仅调用一次。T 代表子任务编号,N 代表有 2N 张牌。
这个函数必需通过调用 Flip 函数来确定牌上写的数字,通过调用 Answer 函数来做出回答。
程序中可以调用以下函数:
-
int Flip(int I, int J)
当指定 JOI 君翻哪两张牌时调用这个函数。参数 I, J 表示 JOI 君需要翻开纸牌 I 和 J。
I 和 J 都必须是 0 到 2N−1(包括两端)的整数,并且 I 不等于 J。如果调用 Flip 函数时不满足条件,则会被判为 Wrong answer [1]。
如果 AI=AJ,则这个函数返回这个值,否则会返回 AI 和 AJ 中更容易记住的那个值。
如果这个函数调用超过 K 次,则会被判为 Wrong answer [2]。
-
void Answer(int I, int J, int X)
这个函数表示写有整数 X 的卡片可以被确定了。
参数 I, J, X 需要满足以下条件:
- 0≤I,J≤2N−1
- I=J
- AI=AJ=X
如果调用时参数不满足以上条件,则会被判为 Wrong answer [3]。
调用时,参数 X 的值需要与先前任意调用中的 X 不同。如果不满足,则会被判为 Wrong answer [4]。
此函数必须恰好被调用 N 次,否则会被判为 Wrong answer [5]。
你的程序可以实现任何其他函数,或定义全局变量。但你的程序无论如何都不可以与标准输入输出或其他文件交互。
附加文件中包含一个样例交互器和交互库,仅用作测试。
样例交互器包含一个文件,文件名为 grader.c 或 grader.cpp。为了测试程序,需执行如下命令:
gcc -std=c11 -O2 -o grader grader.c Memory2.c -lm
g++ -std=c++11 -O2 -o grader grader.cpp Memory2.cpp
如果编译成功,则会生成一个名为 grader 的可执行文件。
请注意,实际判题过程和样例的判题过程不同。样例判题程序作为单进程执行。这个程序需要从标准输入中读入,并输出到标准输出中。
输入格式
第一行三个整数 T,N,K,由一个空格隔开。分别表示子任务编号为 T,有 2N 张牌,和 JOI 君最多问答 K 次。
第二行 N 个整数 P0,P1,…,PN−1,表示 JOI 君对整数的记忆力。
第三行 2N 个整数 A0,A1,…,A2N−1,表示从左到右纸牌上写的整数。
输出格式
如果样例交互程序正常退出,它会向标准输出输出一行如下内容:
- 如果答案正确,输出
Accepted。
- 如果不正确,输出错误的类型,如
Wrong answer [2]。
1 3 10000
0 1 2
1 0 2 0 1 2
提示
样例交互
样例交互过程如下
| 函数调用 |
返回值 |
| Flip(0, 2) |
1 |
| Flip(0, 4) |
1 |
| Flip(1, 2) |
0 |
| Answer(0, 4, 1) |
|
| Flip(1, 3) |
0 |
| Flip(5, 2) |
2 |
| Flip(4, 5) |
1 |
| Answer(1, 3, 0) |
|
| Answer(5, 2, 2) |
0 |
数据范围
所有输入数据满足以下条件:
- 1≤N≤50。
- 0≤Pi≤N−1(0≤i≤N−1)。
- Pi=Pj(0≤i<j≤N−1)。
- 0≤Ai≤N−1(0≤i≤2N−1)。
- 对于任意 x(0≤x≤N−1),恰好存在两个 i(0≤i≤2N−1)满足 Ai=x。
子任务
子任务 1 [10 分]
满足以下条件:
- T=1。
- K=10000。
- Pi=i(0≤i≤N−1)。
子任务 2 [50 分]
满足以下条件:
- T=2。
- K=400。
- Pi=i(0≤i≤N−1)。
子任务 3 [40 分]
满足以下条件:
- T=3。
- K=300。
翻译由 Qwen3-235B 完成