#P14195. [ICPC 2024 Hangzhou R] Identify Chord

    ID: 14126 远端评测题 1000ms 1024MiB 尝试: 0 已通过: 0 难度: 8 上传者: 标签>2024交互题Special JudgeICPC杭州

[ICPC 2024 Hangzhou R] Identify Chord

Description

这是一个交互题。

Grammy 有一个包含 nn 个顶点的无向环图(4n1094 \le n \le 10^9),顶点编号为 11nn。一个无向环图是指有 nn 个顶点和 nn 条无向边,所有边首尾相连形成一个环。具体地,对于每个 1in1 \le i \le n,在顶点 ii 和顶点 ((imodn)+1)((i \bmod n)+1) 之间有一条双向边。

Grammy 觉得这个图太无聊了,于是她偷偷地选择了一对不相邻\textit{不相邻}的顶点,连上一条无向边(称为“弦”),使得该图现在有 nn 个顶点和 n+1n+1 条边。

你的任务是在不超过 4040 次查询内猜出这条弦的位置。每次查询,你可以给出两个顶点 xxyy,Grammy 会告诉你这两个顶点之间的最短路径包含的边数。

请注意,交互器是非自适应的\textit{非自适应的},也就是说弦的位置在交互开始前就被确定。

Input Format

有多组测试数据。输入的第一行包含一个整数 TT1T1031 \le T \le 10^3),表示测试数据组数。对于每组测试数据:

第一行为一个整数 nn4n1094 \le n \le 10^9),表示顶点数。

Output Format

每次查询,需要输出一行,首先输出 ?\texttt{?},然后空格,然后输出两个顶点 xxyy1x,yn1 \le x, y \le n),用空格分隔。输出后需要刷新输出缓冲区,然后你的程序将读入一个整数,表示这两个顶点之间最短路经过的边数。

当你认为找到了弦的位置时,输出一行,首先输出 !\texttt{!},空格,然后输出两个顶点 uuvv1u,vn1 \le u, v \le n),表示弦连接了 uuvv。此时应立即刷新输出缓冲区,之后程序应读入一个整数 rrr{1,1}r\in \{1,-1\}),表示你的猜测是否正确。如果 r=1r=1,表示猜测正确,应继续处理下一个测试数据(或者如果已经没有更多数据则直接退出)。否则,如果 r=1r=-1,表示猜测错误,应立即退出程序,将获得 Wrong Answer\texttt{Wrong Answer} 判定。注意,猜测弦的位置不计入 4040 次查询次数。

在刷新输出缓冲区时,你可以使用:

  • fflush(stdout)\texttt{fflush(stdout)}(如果使用 printf\texttt{printf})或 cout.flush()\texttt{cout.flush()}(如果使用 cout\texttt{cout})在 C 和 C++ 中。
  • System.out.flush()\texttt{System.out.flush()} 在 Java 中。
  • stdout.flush()\texttt{stdout.flush()} 在 Python 中。
2
6

2

1

1
4

2

1


? 1 5

? 2 4

! 4 2


? 2 4

! 1 3

Hint

示例测试点中的图如下图所示:

:::align{center} :::

由 ChatGPT 5 翻译