#P14395. [JOISC 2016] 神经衰弱 / Memory2

    ID: 16164 远端评测题 2000ms 256MiB 尝试: 0 已通过: 0 难度: 6 上传者: 标签>2016交互题Special JudgeJOISC/JOIST(日本)

[JOISC 2016] 神经衰弱 / Memory2

题目背景

翻译参考自 LibreOJ

题目描述

2N2N 张卡片,每张卡片正面写有一个 00N1N-1 之间的整数,且每个整数恰好出现两次。你和 JOI 君正在使用这 2N2N 张卡片进行名为“神经衰弱”的游戏练习。

游戏练习开始时,所有卡片背面朝上,横向排成一列放在桌面上。从左往右第 i+1i+1 张卡片(0i2N10 \le i \le 2N-1)称为卡片 ii,其正面所写的整数记为 AiA_i0i2N10 \le i \le 2N-1)。最初,你和 JOI 君都不知道 AiA_i0i2N10 \le i \le 2N-1)的具体数值。

你和 JOI 君最多可以重复进行 KK 轮如下操作:

  1. 你指定 2N2N 张卡片中的任意两张卡片。
  2. JOI 君将这两张卡片翻面,但确保你无法看到卡片正面所写的整数。如果两张卡片正面所写的整数相等,JOI 君会记住这个值并告诉你;否则,他会从两张卡片正面所写的整数中,选择一个对他而言更容易记住的值告诉你。

JOI 君对整数的记忆难度由 NN 个整数 P0,P1,,PN1P_0, P_1, \dots, P_{N-1} 表示,这些整数满足以下两个条件:

  • 0PiN10 \le P_i \le N-10iN10 \le i \le N-1)。
  • PiPjP_i \ne P_j0i<jN10 \le i < j \le N-1)。

对 JOI 君而言,整数 ii 比整数 jj 更容易记住,当且仅当 Pi<PjP_i < P_j 成立。

你的任务是:通过与 JOI 君进行最多 KK 轮操作,确定每张卡片正面所写的整数。但你并不知道 JOI 君用于表示记忆难度的整数 P0,P1,,PN1P_0, P_1, \dots, P_{N-1} 的具体取值。

题目

请编写一个程序,通过与 JOI 君进行交互操作,确定每张卡片正面所写的整数。

实现细节

你需要写一个程序实现确定每张牌上写的数字的功能。你不需要引入外部头文件,但是你必须声明函数 int Flip(int I, int J);void Answer(int I, int J, int X);。并且,你应当选择不低于 C++17 的语言标准提交。

程序中必需实现以下函数:

  • void Solve(int T, int N)\texttt{void Solve(int T, int N)}
    对于每组测试数据,这个函数仅调用一次。TT 代表子任务编号,NN 代表有 2N2N 张牌。
    这个函数必需通过调用 Flip\texttt{Flip} 函数来确定牌上写的数字,通过调用 Answer\texttt{Answer} 函数来做出回答。

程序中可以调用以下函数:

  • int Flip(int I, int J)\texttt{int Flip(int I, int J)}
    当指定 JOI 君翻哪两张牌时调用这个函数。参数 I, J\texttt{I, J} 表示 JOI 君需要翻开纸牌 IIJJ
    IIJJ 都必须是 002N12N-1(包括两端)的整数,并且 II 不等于 JJ。如果调用 Flip\texttt{Flip} 函数时不满足条件,则会被判为 Wrong answer [1]
    如果 AI=AJA_I=A_J,则这个函数返回这个值,否则会返回 AIA_IAJA_J 中更容易记住的那个值。
    如果这个函数调用超过 KK 次,则会被判为 Wrong answer [2]

  • void Answer(int I, int J, int X)\texttt{void Answer(int I, int J, int X)}
    这个函数表示写有整数 XX 的卡片可以被确定了。
    参数 I, J, X\texttt{I, J, X} 需要满足以下条件:

    • 0I,J2N10\le I,J\le 2N-1
    • IJI\neq J
    • AI=AJ=XA_I=A_J=X

    如果调用时参数不满足以上条件,则会被判为 Wrong answer [3]
    调用时,参数 XX 的值需要与先前任意调用中的 XX 不同。如果不满足,则会被判为 Wrong answer [4]
    此函数必须恰好被调用 NN 次,否则会被判为 Wrong answer [5]

你的程序可以实现任何其他函数,或定义全局变量。但你的程序无论如何都不可以与标准输入输出或其他文件交互。

附加文件中包含一个样例交互器和交互库,仅用作测试。

样例交互器包含一个文件,文件名为 grader.cgrader.cpp。为了测试程序,需执行如下命令:

  • C 语言
gcc -std=c11 -O2 -o grader grader.c Memory2.c -lm
  • C++ 语言
g++ -std=c++11 -O2 -o grader grader.cpp Memory2.cpp

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

请注意,实际判题过程和样例的判题过程不同。样例判题程序作为单进程执行。这个程序需要从标准输入中读入,并输出到标准输出中。

输入格式

第一行三个整数 T,N,KT,N,K,由一个空格隔开。分别表示子任务编号为 TT,有 2N2N 张牌,和 JOI 君最多问答 KK 次。

第二行 NN 个整数 P0,P1,,PN1P_0,P_1,\ldots ,P_{N-1},表示 JOI 君对整数的记忆力。

第三行 2N2N 个整数 A0,A1,,A2N1A_0,A_1,\ldots,A_{2N-1},表示从左到右纸牌上写的整数。

输出格式

如果样例交互程序正常退出,它会向标准输出输出一行如下内容:

  • 如果答案正确,输出 Accepted
  • 如果不正确,输出错误的类型,如 Wrong answer [2]
1 3 10000
0 1 2
1 0 2 0 1 2

提示

样例交互

样例交互过程如下

函数调用 返回值
Flip(0, 2)\texttt{Flip(0, 2)} 1\texttt 1
Flip(0, 4)\texttt{Flip(0, 4)} 1\texttt 1
Flip(1, 2)\texttt{Flip(1, 2)} 0\texttt 0
Answer(0, 4, 1)\texttt{Answer(0, 4, 1)}
Flip(1, 3)\texttt{Flip(1, 3)} 0\texttt 0
Flip(5, 2)\texttt{Flip(5, 2)} 2\texttt 2
Flip(4, 5)\texttt{Flip(4, 5)} 1\texttt 1
Answer(1, 3, 0)\texttt{Answer(1, 3, 0)}
Answer(5, 2, 2)\texttt{Answer(5, 2, 2)} 0\tt 0

数据范围

所有输入数据满足以下条件:

  • 1N501 \le N \le 50
  • 0PiN10 \le P_i \le N-10iN10 \le i \le N-1)。
  • PiPjP_i \ne P_j0i<jN10 \le i < j \le N-1)。
  • 0AiN10 \le A_i \le N-10i2N10 \le i \le 2N-1)。
  • 对于任意 xx0xN10 \le x \le N-1),恰好存在两个 ii0i2N10 \le i \le 2N-1)满足 Ai=xA_i = x

子任务

子任务 1 [10 分]

满足以下条件:

  • T=1T = 1
  • K=10000K = 10\,000
  • Pi=iP_i = i0iN10 \le i \le N-1)。

子任务 2 [50 分]

满足以下条件:

  • T=2T = 2
  • K=400K = 400
  • Pi=iP_i = i0iN10 \le i \le N-1)。

子任务 3 [40 分]

满足以下条件:

  • T=3T = 3
  • K=300K = 300

翻译由 Qwen3-235B 完成