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
`
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 翻译