CF1007C Guess two numbers

题目描述

这是一个交互题。 Vasya 和 Vitya 在玩一个游戏。Vasya 想好了两个整数 $a$ 和 $b$,它们都在 $1$ 到 $n$ 之间,Vitya 需要猜出它们。每一轮,Vitya 会告诉 Vasya 两个数 $x$ 和 $y$,它们也都在 $1$ 到 $n$ 之间。如果 $x=a$ 且 $y=b$,那么 Vitya 获胜。否则,Vasya 必须说出以下三句话中的一句: 1. $x$ 小于 $a$; 2. $y$ 小于 $b$; 3. $x$ 大于 $a$ 或 $y$ 大于 $b$。 Vasya 不能说谎,但如果有多句话都成立,他可以任选其中一句。例如,如果 Vasya 想的数是 $2$ 和 $4$,那么对于询问 $(3,4)$,他会回答第 $3$ 句;对于询问 $(1,5)$,他可以回答第 $1$ 句或第 $3$ 句。 请帮助 Vitya 在不超过 $600$ 轮内获胜。

输入格式

第一行包含一个整数 $n$($1 \leq n \leq 10^{18}$),表示数字的上界。

输出格式

首先,你需要读取数字 $n$,之后你可以进行多次询问。 每次询问,你需要输出两个整数 $x$ 和 $y$($1 \leq x, y \leq n$),然后刷新输出。 每次询问后,读取一个整数 $ans$($0 \leq ans \leq 3$)。 如果 $ans > 0$,表示 Vasya 说出的句子的编号。 如果 $ans = 0$,表示你猜中了,程序应当终止。 如果你询问超过 $600$ 次或询问不合法,你会得到 Wrong Answer。 如果你没有输出任何内容或忘记刷新输出,你会得到 Idleness Limit Exceeded。 刷新输出的方法如下: - C++:fflush(stdout) - Java:System.out.flush() - Python:stdout.flush() - Pascal:flush(output) - 其它语言请查阅相关文档。 Hack 格式 对于 Hack,请使用以下格式: 第一行输出一个整数 $n$($1 \leq n \leq 10^{18}$),表示数字的上界。 第二行输出两个整数 $a$ 和 $b$($1 \leq a, b \leq n$),表示 Vasya 想的数字。 第三行输出一个整数 $m$($1 \leq m \leq 10^5$),表示交互器的指令数。 接下来的 $m$ 行,每行输出五个整数:$x_i$、$y_i$、$r^{12}_i$、$r^{13}_i$、$r^{23}_i$($1 \leq x_i, y_i \leq n$),其中 $r^{ST}_i$ 取值为 $S$ 或 $T$。 对于询问 $x, y$,交互器会找到一个 $i$($1 \leq i \leq n$),使得 $|x-x_i| + |y-y_i|$ 最小。如果有多个 $i$ 满足,选择最小的 $i$。然后交互器会根据情况回答,如果有两句话 $S$ 和 $T$ 都可以说,则选择 $r^{ST}_i$。 例如,样例测试数据文件如下: `

5

2 4

2

2 5 1 1 2

4 1 2 3 3

`

说明/提示

我们来分析样例测试。选中的数字是 $2$ 和 $4$。交互器给出了两条指令。 对于询问 $(4, 3)$,可以返回 $2$ 或 $3$。在两条指令中,第二条被选中,所以交互器返回 $a^{23}_2=3$。 对于询问 $(3, 4)$,只能返回 $3$。 对于询问 $(3, 3)$,可以返回 $2$ 或 $3$。在两条指令中,第一条被选中(因为在相等时选择编号最小的),所以交互器返回 $a^{23}_1=2$。 对于询问 $(1, 5)$,可以返回 $1$ 或 $3$。在两条指令中,第一条被选中,所以交互器返回 $a^{13}_1=1$。 在第五次询问 $(2, 4)$ 时,数字被正确猜出,玩家获胜。 由 ChatGPT 4.1 翻译