#CF2066A. 物体识别
物体识别
A. 物体识别
时间限制:每个测试点 秒
内存限制: MB
本题为交互题。
题目描述
你已知一个数组 ,其中每个 是 到 之间的整数。
评测系统拥有一个固定但隐藏的数组 ,每个 也是 到 之间的整数,但你不清楚它的内容。
此外,保证对于所有 ,有 ,且所有数对 互不相同。
评测系统秘密选择了以下两种物体之一,你需要判断它选择的是哪一种:
- 物体 A:一个有 个顶点(编号 到 )的有向图,包含 条形式为 的边。
- 物体 B:平面上的 个点,第 个点的坐标为 。
交互方式
为了判断评测系统选择的是哪种物体,你可以进行查询。
每次查询,你需要指定两个不同的整数 (,),然后你会收到一个数字作为回答:
- 如果评测系统选择的是物体 A,你会收到从顶点 到顶点 的最短路径长度(边数);如果不存在路径,则返回 。
- 如果评测系统选择的是物体 B,你会收到点 和点 之间的曼哈顿距离,即 。
你最多可以进行 次查询,以确定评测系统选择的是物体 A 还是物体 B。
输入格式
每个测试点包含多个测试用例。
第一行输入一个整数 (),表示测试用例的数量。
每个测试用例开始时,首先读取 ()——数组的长度。
接下来读取 个整数 ()。
保证所有测试用例的 之和不超过 。
数组 在每个测试用例中是固定的,并且交互器是非自适应的(即不会根据你的查询改变隐藏数据)。
交互协议
- 发起查询:输出
? i j(不含引号,,),然后读取一个整数作为回答。 - 给出答案:输出
! A或! B(表示你认为隐藏的是物体 A 或物体 B)。
注意:输出答案不计入那 次查询。
每次输出后必须刷新输出缓冲区(例如 C++ 中使用 fflush(stdout) 或 cout.flush(),Python 中使用 sys.stdout.flush())。
如果读取到 ,说明你的查询有误或发生了其他错误,此时必须立即退出程序。
样例
输入
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
样例解释
- 第一个测试用例:,,评测系统选择了物体 A。
- 第二个测试用例:,,评测系统选择了物体 B。
黑客(Hack)格式
第一行一个整数 (),表示测试用例数量。
每个测试用例:
- 第一行:()
- 第二行: 个整数 ()
- 第三行: 个整数 ()
保证 且所有 互不相同 - 第四行:一个字符
A或B,表示你想要隐藏的物体
所有测试用例的 之和不超过 。