#P1637. 陈千语不是啥龙 [EGOI 2025 Dark Ride]

陈千语不是啥龙 [EGOI 2025 Dark Ride]

题目背景

粉色奶龙和啥龙在van游戏

Alt text

题目

啥龙面前有 NN 个仓库取货口,从左到右编号为 00N1N-1 ,每个取货口可以指定输出两种矿物之一: 源矿 或 蓝铁矿。取货口连接着一个传送带系统,会把出货口的输出按照一定顺序打乱并传送到 NN 个输出口,但是啥龙并不知道这个顺序。输出口从左到右编号为 00N1N-1,每个输出口前有一个速冻仔。

粉色奶龙会让速冻仔从左到右报数,报数规则如下:

  • 最左边的速冻仔报 00
  • 对于其他速冻仔,如果自己面前的矿物与左边相邻的速冻仔面前的矿物不同,则报左边速冻仔的报数加 11;否则报与左边相同的数。

然后粉色奶龙会告诉啥龙最后一个速冻仔报了什么数。

啥龙可以多次进行实验:每次她可以自由设定所有输入口的矿物种类,然后得到最后一个速冻仔的报数。她的目标是确定两个端点输出口(输出口 00 和输出口 N1N-1)对应哪两个取货口。

由于啥龙的智商超群,所以请来了管理员你来狐假虎威帮助她赢得游戏。

交互方式

  • 你的程序应首先读取一行包含整数 NN:仓库取货口的数量。
  • 然后,你的程序应与交互器交互。要开始一次实验,你应输出一行以问号 ? 开头,然后是一个长度为 NN 的字符串,有 00 (原矿)和 11 (蓝铁矿)组成,表示你如何设置 NN 个取货口的输出。然后,你的程序应读取一个整数 ll (0l<N)(0 \leq l < N),即最后一个速冻仔报的数。
  • 当你想要回答时,输出一行以感叹号 ! 开头,后面跟着两个整数AABB (0A,B<N)(0\leq A,B < N)。为了让你的答案被接受,这必须是对应输出口 00 和输出口 N1N-1 的取货口编号,顺序不限。之后,你的程序应退出。

交互器是非自适应的,这意味着取货口和输出口的对应关系在交互开始前就已确定。

请确保在每次实验后刷新标准输出,否则你的程序可能会被判定为超时。在 Python 中,只要使用 input() 读取行,输出会自动刷新。在 C++ 中,cout << endl; 除了输出换行外还会刷新;如果使用 printf,请使用 fflush(stdout)

样例 1

隐藏的对应关系:

取货口 输出口
00 2
11 1
22 0
33 3
44 4
交互器输出 你的输出
5
? 10001
3
? 10110
3
! 2 4

在样例 1 中,有 55 个取货口。 第一次实验中,速冻仔(从左到右)面前的矿物分别是 源矿、源矿、蓝铁矿、源矿、蓝铁矿,报的数为 [0,0,1,2,3][0, 0, 1, 2, 3],所以交互器输出 33。 第二次实验中,速冻仔(从左到右)面前的矿物分别是 蓝铁矿、源矿、蓝铁矿、蓝铁矿、源矿,报的数为 [0,1,2,2,3][0, 1, 2, 2, 3],所以交互器输出 33。 最后啥龙得出对应输出口 00 和输出口 N1N-1 的取货口是第 22 和 第 44 个取货口(次序不限),! 2 4! 4 2 都是可接受的答案。

样例 2

隐藏的对应关系:

取货口 输出口
00 2
11 0
22 1
交互器输出 你的输出
3
? 111
0
? 110
2
? 000
0
! 1 0

在样例 2 中,有 33 个取货口。 第一次实验中,速冻仔(从左到右)面前的矿物分别是 蓝铁矿、蓝铁矿、蓝铁矿,报的数为 [0,0,0][0, 0, 0],所以交互器输出 00。 第二次实验中,速冻仔(从左到右)面前的矿物分别是 蓝铁矿、源矿、蓝铁矿,报的数为 [0,1,2][0, 1, 2],所以交互器输出 22。 第三次实验中,速冻仔(从左到右)面前的矿物分别是 源矿、源矿、源矿,报的数为 [0,0,0][0, 0, 0],所以交互器输出 00。 最后啥龙得出对应输出口 00 和输出口 N1N-1 的取货口是第 00 和 第 11 个取货口(次序不限),! 0 1! 1 0 都是可接受的答案。

样例 3

隐藏的对应关系:

取货口 输出口
00 0
11 1
22 2
33 3
交互器输出 你的输出
4
? 1010
3
! 0 3

在样例 3 中,有 44 个取货口。 第一次实验中,速冻仔(从左到右)面前的矿物分别是 蓝铁矿、源矿、蓝铁矿、源矿,报的数为 [0,1,2,3][0, 1, 2, 3],所以交互器输出 33。 最后啥龙得出对应输出口 00 和输出口 N1N-1 的取货口是第 00 和 第 33 个取货口(次序不限),! 0 3! 3 0 都是可接受的答案。

数据范围与提示

对于所有输入数据,满足:

  • 3N300003 \leq N \leq 30000
  • 你最多可以发起 3030 次实验,(输出最终答案不计入实验次数)。如果你超过这个限制,将得到判为 “Wrong Answer”。

详细子任务附加限制及分值如下表所示。

子任务 分值 附加限制
11 99 N=3N=3
22 1515 N30N \leq 30
33 1717 取货口 00 对应输出口 00
44 1616 NN 是偶数,一个端点输出口对应的的取货口在前半部分 (0A<N2)(0 \leq A < \frac{N}{2}),另一个端点输出口对应的取货口在后半部分 (N2B<N)( \frac{N}{2} \leq B < N)
55 1414 N1000N \leq 1000
66 2929 无附加限制