#P12455. [UOI 2024] Points on a Line

[UOI 2024] Points on a Line

题目描述

这是一道交互题。

数轴上有 nn 个整数坐标的点 x1,x2,,xnx_1, x_2, \ldots, x_n。保证对于所有 1in1\le i\le n 都有 1xin1\le x_i\le n

当且仅当点 xkx_k 位于由点 xix_ixjx_j 构成的线段上时,我们称点 xkx_k 在点 xix_ixjx_j 之间。形式化地说,点 xkx_k 在点 xix_ixjx_j 之间当且仅当 xixkxjx_i \leq x_k \leq x_jxjxkxix_j \leq x_k \leq x_i

你需要找到任意两个下标 iijj,使得所有 nn 个点都位于点 xix_ixjx_j 之间。

你可以使用以下查询:选择三个下标 (ii, jj, kk) 并查询点 xkx_k 是否在点 xix_ixjx_j 之间。

你最多可以使用 2222222222 次查询。

保证点的坐标在交互开始前就已固定。换句话说,交互器不是自适应的

输入格式

第一行包含一个整数 nn (3n21043 \le n \le 2 \cdot 10^4) —— 点的数量。

输出格式

要发起查询,请输出 "?\tt{?} ii jj kk" (1i,j,kn1 \le i, j, k \le n),然后输出换行符并执行 flush\tt{flush} 操作。

作为查询的响应,评测程序将输出一个整数 ff (f{0,1}f \in \{0,1\})。如果 f=1f = 1,表示点 xkx_k 在点 xix_ixjx_j 之间;如果 f=0f = 0,则表示不在。

如果查询无效(即超过最大查询次数或查询参数无效),评测程序将输出 -1\texttt{-1} 并终止。此时,程序应立即终止,否则会被判为 WrongAnswer\tt{Wrong Answer}

当你准备好给出答案时,请以 "!\tt{!} ii jj" (1i,jn1 \leq i, j \leq n) 的格式输出,其中 iijj 是所求点的下标。输出后终止程序。

flush\tt{flush} 操作的具体实现方式如下:

  • C++:fflush(stdout)\texttt{fflush(stdout)}cout.flush()\texttt{cout.flush()}
  • Java:System.out.flush()\texttt{System.out.flush()}
  • Pascal:flush(output)\texttt{flush(output)}
  • Python:sys.stdout.flush()\texttt{sys.stdout.flush()}

可以参考给出的模板代码。

说明/提示

4
? 1 4 2
1
? 1 4 3
1
! 1 4

在示例中,点的坐标为 x=[1,2,3,4]x = [1, 2, 3, 4]

评分标准

  • 1717 分):n20n \le 20
  • 1616 分):n100n \le 100
  • 3030 分):n10000n \le 10000
  • 2323 分):n20000n \le 20000xi2x_i \le 2
  • 1010 分):n12000n \le 12000
  • 44 分):无额外限制。

翻译由 DeepSeek V3 完成