#CF2067D. 对象识别
对象识别
D. 对象识别
每个测试的时间限制:2 秒
每个测试的内存限制:256 兆字节
这是一个交互式问题。
你有一个数组 ,其中的数字是从 到 的整数。
评测系统有一个固定但隐藏的数组 ,其中的数字也是从 到 的整数,但数组 对你来说是不可知的。
此外,已知对于所有 都有 ,并且所有 对都是不同的。
系统秘密地选择了以下两种对象中的一种,你需要确定具体是哪一种:
- 对象 A:一个有 个顶点(编号 到 )的有向图,包含 条边,边的形式为 。
- 对象 B:平面上的 个点,第 个点的坐标为 。
为了猜测系统想的是哪个对象,你可以进行查询。
在一次查询中,你必须指定两个数字 ()。作为回复,你会收到一个数字:
- 如果系统选择的是对象 A,你会收到从顶点 到顶点 在图中的最短路径长度(边的条数),若不存在路径则返回 。
- 如果系统选择的是对象 B,你会收到点 和点 之间的曼哈顿距离 。
你只有 次查询来确定系统选的是哪个对象。
输入格式
每个测试点包含多个测试用例。
第一行包含测试用例数量 ()。
每个测试用例的交互过程开始于:
- 读取 (),表示数组 和 的长度。
- 接下来读取 个整数:()。
保证:
- 所有测试用例的 之和不超过 。
- 数组 在测试用例开始时就固定了(交互器是非自适应的)。
- 对于所有 ,有 ,且所有 对互不相同。
交互方式
- 要发起一次查询,输出
? i j(不带引号,),然后读取回复。 - 要给出答案,输出
! A(如果是对象 A)或! B(如果是对象 B)。输出答案不计入两次查询限制。
每次输出后要刷新输出缓冲区(flush),否则会得到 Idleness limit exceeded。
如果交互过程中读到 ,说明查询非法或出现了其他错误,此时你的程序必须立即退出,否则可能得到任意评测结果。如果查询正确,返回值不会是 。
Hacks 模式(用于本地测试)
第一行:
每个测试用例:
- 第一行:
- 第二行: 个整数
- 第三行: 个整数 (满足 且 互不相同)
- 第四行:一个字符
A或B,表示你要隐藏的对象
所有 之和不超过 。
样例
输入:
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(点)。