#430. 不动点竞猜
不动点竞猜
题目描述
这是一个交互题。
初始时,有一个数组 ,其中 是一个奇数正整数。评测器选取了 对不相交的元素对,然后将这些元素对中的元素进行交换。例如,如果 ,并且交换了 和 这两对元素,那么最终数组为 。
经过这些交换后,恰好有一个元素的位置没有发生变化。你需要找出这个没有移动位置的元素。
为此,你可以进行若干次查询。每次查询,你可以选择两个整数 和 ()。作为回应,你将获得子数组 按升序排列后的结果。
请找出那个没有移动位置的元素。
你最多可以进行 次查询。
数组 在交互开始前就已经确定,并且在你的查询过程中不会发生变化。
注意:如果数组 是数组 的一个子数组,那么 可以通过从 的开头和结尾各删除若干(可能为零)元素得到。
输入格式
第一行包含一个整数 (, 为奇数)——数组 的长度。
读入 之后,你应当开始与评测器进行交互,评测器会根据你程序的输出内容给出相应的回答。
输出格式
每进行一次查询,输出一行 ""(),不包含引号。随后,你应当读入 个整数——即 按升序排列后的结果。每个测试用例最多允许进行 次这样的查询。
当你准备给出最终答案时,输出一行 ""(),不包含引号——表示没有移动位置的元素。给出最终答案不计入 次查询限制。
每次输出查询后不要忘记换行。
C++代码示例
//your code
cout << "? 1 5" << endl;
//your code
输入输出样例
5
1 2 4 5
1 3 5
3
1
? 1 4
? 3 5
! 2
? 1 1
! 1
说明/提示
-
在第一个测试用例中,隐藏数组为 ,长度为 。
,选手请求了子数组 ,评测器返回排序后的结果 。
选手请求了子数组 ,评测器返回排序后的结果 。
选手判断 ,并输出,判定答案正确。
-
在第二个测试用例中,隐藏数组为 ,长度为 。
选手请求了 ,评测器返回 。
选手判断 ,并输出。答案正确。
注意:示例输入输出中多出的换行仅为便于阅读,实际交互中不会出现。