#P12552. [UOI 2024] Points on a Line

    ID: 14117 远端评测题 1000ms 256MiB 尝试: 0 已通过: 0 显示难度提高 上传者: 标签>2024交互题Special JudgeUOI(乌克兰)

[UOI 2024] Points on a Line

题目描述

这是一道交互题。

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

当且仅当点 xkx_k 位于由点 xix_i 和 xjx_j 构成的线段上时,我们称点 xkx_k 在点 xix_i 和 xjx_j 之间。形式化地说,点 xkx_k 在点 xix_i 和 xjx_j 之间当且仅当 xi≤xk≤xjx_i \leq x_k \leq x_j 或 xj≤xk≤xix_j \leq x_k \leq x_i。

你需要找到任意两个下标 ii 和 jj,使得所有 nn 个点都位于点 xix_i 和 xjx_j 之间。

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

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

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

输入格式

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

输出格式

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

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

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

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

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 分):n≤20n \le 20;
  • (1616 分):n≤100n \le 100;
  • (3030 分):n≤10000n \le 10000;
  • (2323 分):n≤20000n \le 20000,xi≤2x_i \le 2;
  • (1010 分):n≤12000n \le 12000;
  • (44 分):无额外限制。

翻译由 DeepSeek V3 完成