#3095. G-寻找'0'
G-寻找'0'
G-寻找'0'
题目描述
这是一个交互题。如果你从未写过,请查看题目最后注意事项。
给定一个整数 。存在一个长度为 的隐藏数组 。从 到 的每个整数在 中都恰好出现一次,其余元素均为 。
你可以进行如下类型的查询:
- 选择两个整数 和 (,),裁判会回应 ,如果 ,否则回应 。
- 使用
? i j向交互器询问,如果你找到了答案,请使用! x告知交互器并停止程序。
请在不超过 次查询内,找到任意一个满足 的整数 ()。注意交互方是自适应的,这意味着隐藏数组 可能会根据你的查询动态变化,但不会违反之前的查询结果。
当找到结果但程序未停止,或超出查询限制时,交互器将返回0分。
输入格式
每组测试数据包含多个测试用例。第一行包含测试用例数 ()。接下来是各个测试用例的描述。
每个测试用例的第一行包含一个整数 ()。隐藏数组 的长度为 。
保证所有测试用例中 的总和不超过 。
输出格式
(交互题,无需输出格式固定说明。)
输入输出样例 #1
输入 #1
2
2
0
1
3
1
0
0
输出 #1
? 1 2
? 3 1
! 3
? 5 6
? 2 4
? 1 3
! 6
说明/提示
在第一个示例测试用例中,隐藏数组 为 :
- 第一次查询,。由于 ,,,裁判回应 。
- 第二次查询,。由于 ,,,裁判回应 。
- 程序报告 作为答案。由于 ,答案正确。
在第二个示例测试用例中,隐藏数组 为 :
- 第一次查询,。由于 ,,,裁判回应 。
- 第二次查询,。由于 ,,,裁判回应 。
- 第三次查询,。由于 ,,,裁判回应 。
- 程序报告 作为答案。由于 ,答案正确
- 。
交互题注意事项
对于这类题目,只需像往常一样将询问写到标准输出,刷新输出缓冲 后从标准输入读取结果。
选手程序刷新输出缓冲后,通过管道连接它的测评程序(称为交互器)才能立刻接收到这些数据。
因为如果你输出了一些数据,这些数据可能被放置于内部缓存区里,而且或许没有被直接传输给 interactor。
为了避免这种情况的发生,你需要每次输出时用一种特殊的清除缓存操作。
你可以使用如下语句来清空缓冲区:
- 对于 C/C++:fflush(stdout);
- 对于 C++:std::cout << std::flush;
- 对于 Java:System.out.flush();
- 对于 Python:stdout.flush();
- 对于 Pascal:flush(output);
- 对于其他语言,请自行查阅对应语言的帮助文档。
特别的,对于 C++ 语言,在输出换行时如果你使用 std::endl 而不是 '\n',也可以自动刷新缓冲区。
相关
在下列比赛中: