[WFOI - 01] 猜数(guess)
题目背景
**这是一道交互题。交互库自适应。请注意特殊的时间限制。**
**每次输出后请记得清空缓存**
简化题意:[$\texttt{Link}$](https://www.luogu.com.cn/paste/xx7sa8go)。
题目描述
你需要猜一个正整数 $q$,保证 $q\in [1,n]$;
你每次可以用诸如 `? x y` 的询问,交互库会在 $[x,y]$ 中指定选择一个数 $z$;
然后交互库会输出形如 `u v` 的回答,表示指定的数是 $u$,其与 $q$ 的关系为 $v$;
具体地,
- 当交互库返回的 $v=0$ 时,表示 $u<q$;
- 当交互库返回的 $v=1$ 时,表示 $u=q$;
- 当交互库返回的 $v=2$ 时,表示 $u>q$。
而一次询问的代价是 $\dfrac{1}{y-x+1}$;
你可以通过 `! x` 输出你认为正确的答案。
现在你要求出 $q$。
------------
设你的代价为 $x$,你每个测试点获得的分数和你的总代价有如下关系(每个测试点满分 $10$ 分):
- 若 $x\le 1.9813035$,则你可以得到 $\text{10 pts}$;
- 若 $1.9813035 < x \le 12$,则你可以得到 $\lfloor(12-x)\times0.7 \div 1.00186965\rfloor \text{ pts}$。
- 若 $x\ge12$,则你可以得到 $\text{0 pts}$。
需要注意的是,在每一次操作后,需要调用以下函数刷新缓存:
- 对于 C/C++:`fflush(stdout)`;
- 对于 C++:`std::cout << std::flush`;
- 对于 Java:`System.out.flush()`;
- 对于 Python:`stdout.flush()`;
- 对于 Pascal:`flush(output)`;
- 对于其他语言,请自行查阅对应语言的帮助文档。
### 交互格式
一开始交互库会给你 $n$,
然后你可以按题目描述中的方式进行询问或回答答案;
在回答后请立即退出程序。
输入输出格式
输入格式
见交互格式。
输出格式
见交互格式。
输入输出样例
输入样例 #1
2
1 0
输出样例 #1
? 1 2
! 2
输入样例 #2
3
1 0
3 2
输出样例 #2
? 1 3
? 3 3
! 2
说明
- **样例 $1$ 解释:**
询问后发现 $1<x\le2$,所以 $x=2$;
- **样例 $2$ 解释:**
第一次询问后发现 $1<x\le3$;
第二次询问后发现 $1<x<3$,所以 $x=2$;
**【数据规模与约定】**
| 测试点编号 | $n \le$ | 测试点编号 | $n\le$ |
| :-: | :-: | :-: | :-: |
| $\texttt{1}$ | $1$ | $\texttt{6}$ | $2\times 10^3$ |
| $\texttt{2}$ | $7$ | $\texttt{7}$ | $10^4$ |
| $\texttt{3}$ | $20$ | $\texttt{8}$ | $5\times 10^4$ |
| $\texttt{4}$ | $80$ | $\texttt{9}$ | $10^5$ |
| $\texttt{5}$ | $300$ | $\texttt{10}$ | $10^5$ |
对于 $100\%$ 的数据,$1\le n\le10^5$,$1\le q,\forall u\le n$,$\forall v\in\{0,1,2\}$。
保证每询问一次交互库时间是 $\mathcal O(1)$ 的。