#P6682. [BalticOI 2020 Day1] 染色

[BalticOI 2020 Day1] 染色

题目描述

Linda 喜欢时不时改变她头发的颜色,如果她的男友 Archie 注意到她头发颜色发生了改变,Linda 会十分高兴。当且仅当 Archie 发现 Linda 的头发颜色发生改变时,Archie 才会去评论 Linda 头发的新颜色。这意味着 Linda 始终可以知道 Archie 是否发现她的头发颜色有改变。

现在市场上有一个新染发剂系列,该染发剂系列有 NN 种颜色,从 11NN 编号。两个颜色的相近程度与它们编号的差值有关——差值越小,则越相近。

Linda 发现,对于该系列的染发剂,存在一个色差阈值 CC1CN1 \leq C \leq N)。具体来说,假如 Linda 之前使用的染发剂颜色编号为 colorprewcolor_{prew},Linda 接下来打算使用的染发剂颜色编号为 colornewcolor_{new},则 Archie 会注意到 Linda 的颜色头发差异,当且仅当 colornewcolorprewC\left | color_{new}-color_{prew}\right | \geq C

现在 Linda 买下了一套该系列的染发剂,准备做一个实验。她会不断地更换头发的颜色,并观察 Archie 是否注意到了头发颜色发生改变。因为染发剂有限,每种颜色的染发剂最多只能使用一次。

在实验开始之前,Linda 使用的是另外一个系列的染发剂,因此讨论第一次染发后 Archie 的反应是没有意义的。

现在 Linda 想要通过有限的时间找到阈值 CC,请写一个程序帮助她完成这个任务。

交互方式

本题是一道交互题。

与原题不同的是,为了压缩数据组数,本题单个测试点中将包含多组数据。

输入第一行包含一个整数 TT,表示该测试点的数据组数。

对于每组数据,你首先将读入一个整数 NN,代表该系列染发剂的颜色数量。

接下来,你可以按如下形式输出来进行询问:? P。其中 PP 代表 Linda 下一次要使用的染发剂的颜色编号。你输出的 PP 需要满足 1PN1 \leq P \leq N,且任意两次询问的 PP 均不相同。

在询问过后,你的程序将读入一个整数,若这个整数为 11,代表 Archie 注意到了 Linda 头发颜色的变化;若为 00,则表示他没有注意到颜色的变化。

当你确认了阙值 CC 后,按如下格式输出答案:= C

如果答案正确,将会直接进入下一组数据的交互。

如果答案错误,交互器将直接终止你的程序。

对于每组测试数据,你的程序可以最多进行 6464 次询问(最后输出答案不算作询问)。

请注意,一般情况下程序的输出会存放在缓冲区中,为了确保你的输出能被交互库接收,请在输出一行之后刷新缓冲区。

  • 对于 C++ 语言,可以使用 std::cout<<std::endl 来在输出换行的同时刷新缓冲区;
  • 对于 Java 语言,可以使用 System.out.flush(); 来刷新缓冲区;
  • 对于 Python 语言,可以使用 sys.stdout.flush() 来刷新缓冲区。
1
7

1

1

0

0

1



? 2

? 7

? 4

? 1

? 5

= 4

提示

样例解释

为了方便各位理解交互过程,部分行之间人为添加了空行。

下面依次解释每次询问过程:

  1. 这一次询问的结果无意义。
  2. 此次询问后有 C5C \leq 5
  3. 此次询问后有 3<C53 \lt C \leq 5,这时候可以考虑检测差值为 44 时的情况。但因为 4+4=84+4=844=04-4=0 都不合法,因此不再考虑这么做。
  4. 此次询问后有 3<C53 \lt C \leq 5
  5. 此次询问后有 3<C43 \lt C \leq 4,即 C=4C=4

子任务

所有数据均满足:1T12001 \leq T \leq 12001<N10181 < N \leq 10^{18}

  • 子任务 1(9 分):N64N \leq 64
  • 子任务 2(13 分):N125N \leq 125
  • 子任务 3(21 分):N103N \leq 10^3
  • 子任务 4(24 分):N109N \leq 10^9
  • 子任务 5(33 分):无特殊限制。