#CF2066A. 物体识别

物体识别

A. 物体识别

时间限制:每个测试点 22
内存限制256256 MB

本题为交互题


题目描述

你已知一个数组 x1,x2,,xnx_1, x_2, \dots, x_n,其中每个 xix_i11nn 之间的整数。
评测系统拥有一个固定但隐藏的数组 y1,y2,,yny_1, y_2, \dots, y_n,每个 yiy_i 也是 11nn 之间的整数,但你不清楚它的内容。
此外,保证对于所有 ii,有 xiyix_i \neq y_i,且所有数对 (xi,yi)(x_i, y_i) 互不相同。

评测系统秘密选择了以下两种物体之一,你需要判断它选择的是哪一种:

  • 物体 A:一个有 nn 个顶点(编号 11nn)的有向图,包含 nn 条形式为 xiyix_i \to y_i 的边。
  • 物体 B:平面上的 nn 个点,第 ii 个点的坐标为 (xi,yi)(x_i, y_i)

交互方式

为了判断评测系统选择的是哪种物体,你可以进行查询
每次查询,你需要指定两个不同的整数 i,ji, j1i,jn1 \le i, j \le niji \neq j),然后你会收到一个数字作为回答:

  • 如果评测系统选择的是物体 A,你会收到从顶点 ii 到顶点 jj最短路径长度(边数);如果不存在路径,则返回 00
  • 如果评测系统选择的是物体 B,你会收到点 ii 和点 jj 之间的曼哈顿距离,即 xixj+yiyj|x_i - x_j| + |y_i - y_j|

最多可以进行 22 次查询,以确定评测系统选择的是物体 A 还是物体 B。


输入格式

每个测试点包含多个测试用例。
第一行输入一个整数 tt1t10001 \le t \le 1000),表示测试用例的数量。

每个测试用例开始时,首先读取 nn3n2×1053 \le n \le 2 \times 10^5)——数组的长度。
接下来读取 nn 个整数 x1,x2,,xnx_1, x_2, \dots, x_n1xin1 \le x_i \le n)。

保证所有测试用例的 nn 之和不超过 2×1052 \times 10^5
数组 y1,y2,,yny_1, y_2, \dots, y_n 在每个测试用例中是固定的,并且交互器是非自适应的(即不会根据你的查询改变隐藏数据)。


交互协议

  • 发起查询:输出 ? i j(不含引号,1i,jn1 \le i, j \le niji \neq j),然后读取一个整数作为回答。
  • 给出答案:输出 ! A! B(表示你认为隐藏的是物体 A 或物体 B)。
    注意:输出答案不计入那 22 次查询。

每次输出后必须刷新输出缓冲区(例如 C++ 中使用 fflush(stdout)cout.flush(),Python 中使用 sys.stdout.flush())。
如果读取到 1-1,说明你的查询有误或发生了其他错误,此时必须立即退出程序。


样例

输入

2
3
2 2 3

1

0

5
5 1 4 2 3

4

4

输出

? 2 3

? 1 2

! A

? 1 5

? 5 1

! B

样例解释

  • 第一个测试用例x=[2,2,3]x = [2,2,3]y=[1,3,1]y = [1,3,1],评测系统选择了物体 A
  • 第二个测试用例x=[5,1,4,2,3]x = [5,1,4,2,3]y=[3,3,2,4,1]y = [3,3,2,4,1],评测系统选择了物体 B

黑客(Hack)格式

第一行一个整数 tt1t10001 \le t \le 1000),表示测试用例数量。
每个测试用例:

  • 第一行:nn3n2×1053 \le n \le 2 \times 10^5
  • 第二行:nn 个整数 x1,x2,,xnx_1, x_2, \dots, x_n1xin1 \le x_i \le n
  • 第三行:nn 个整数 y1,y2,,yny_1, y_2, \dots, y_n1yin1 \le y_i \le n
    保证 xiyix_i \neq y_i 且所有 (xi,yi)(x_i, y_i) 互不相同
  • 第四行:一个字符 AB,表示你想要隐藏的物体

所有测试用例的 nn 之和不超过 2×1052 \times 10^5