#CF1918E. ace5 与任务排序

ace5 与任务排序

E. ace5 与任务排序

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

这是一道交互题!

在新一轮比赛中,共有 nn 道难度从 11nn 的任务。协调员决定让第一轮的任务不按难度顺序出现,于是重新排列了任务,得到一个从 11nn 的难度排列。之后,协调员要求 ace5 通过以下方式猜出这个排列。

初始时,协调员在 11nn 之间选择一个数 xx

ace5 可以提出如下形式的询问:? i。回答将是:

  • >,若 ai>xa_i > x,然后 xx 增加 11
  • <,若 ai<xa_i < x,然后 xx 减少 11
  • =,若 ai=xa_i = x,然后 xx 保持不变。

ace5 的任务是在不超过 40n40n 次询问内猜出排列。由于 ace5 忙于撰写公告,他把这个任务交给了你。

输入
第一行包含一个整数 tt1t10001 \le t \le 1000)——测试用例的数量。

交互过程
你的程序与评测系统之间的交互从读入一个正整数 nn1n20001 \le n \le 2000)开始,nn 为隐藏排列的长度。

要提出询问,输出一行形如 ? i 的内容,其中 1in1 \le i \le n

作为回答,你将收到:

  • >,若 ai>xa_i > x,然后 xx 增加 11
  • <,若 ai<xa_i < x,然后 xx 减少 11
  • =,若 ai=xa_i = x,然后 xx 保持不变。

你最多可以进行 40n40n 次询问。要输出答案,需要打印 ! a_1 a_2 ... a_n,其中 1ain1 \le a_i \le n,且所有元素互不相同。输出答案不计入询问次数。

如果你的程序在一个测试用例中进行了超过 40n40n 次询问,或发出了无效询问,则回答将是 -1。收到该回答后,你的程序应立即终止,以获得 Wrong Answer 判定。否则,可能会得到其他判定。

在输出询问后,请不要忘记打印换行符并刷新输出缓冲区。否则,你会收到 Presentation Error 判定。刷新缓冲区的方法:

  • C++:fflush(stdout)cout.flush()
  • Java:System.out.flush()
  • Pascal:flush(output)
  • Python:stdout.flush()
  • 其他语言请参考对应文档。

保证所有测试用例的 nn 之和不超过 20002000

本题的交互器 不是 自适应的。

Hacks(构造数据)
要构造一个 hack,使用如下格式:

第一行包含一个整数 tt ——测试用例的数量。

每个测试用例的描述包含两行。第一行包含整数 nnxx1xn20001 \le x \le n \le 2000)——隐藏排列的长度和数字 xx 的初始值。第二行包含 nn 个互不相同的整数 a1,a2,,ana_1, a_2, \dots, a_n1ain1 \le a_i \le n)——评测系统在该测试用例中使用的排列。

所有测试用例的 nn 之和不超过 20002000

样例
输入

2
5

>

=

<

=

<

<

2

>

输出

? 4

? 2

? 1

? 5

? 1

? 3

! 2 4 1 5 3

? 1

! 2 1 

说明
在第一个测试用例中,隐藏排列 a=[2,4,1,5,3]a = [2, 4, 1, 5, 3],初始 x=3x = 3

在第二个测试用例中,隐藏排列 a=[2,1]a = [2, 1],初始 x=1x = 1