#P7998. [WFOI - 01] 猜数(guess)

    ID: 7295 Type: RemoteJudge 300ms 512MiB Tried: 0 Accepted: 0 Difficulty: 9 Uploaded By: Tags>动态规划,dp洛谷原创交互题Special Judge其它技巧洛谷月赛

[WFOI - 01] 猜数(guess)

题目背景

这是一道交互题。交互库自适应。请注意特殊的时间限制。

每次输出后请记得清空缓存

简化题意:Link\texttt{Link}。

题目描述

你需要猜一个正整数 qq,保证 q∈[1,n]q\in [1,n];

你每次可以用诸如 ? x y 的询问,交互库会在 [x,y][x,y] 中指定选择一个数 zz;

然后交互库会输出形如 u v 的回答,表示指定的数是 uu,其与 qq 的关系为 vv;

具体地,

  • 当交互库返回的 v=0v=0 时,表示 u<qu<q;
  • 当交互库返回的 v=1v=1 时,表示 u=qu=q;
  • 当交互库返回的 v=2v=2 时,表示 u>qu>q。

而一次询问的代价是 1y−x+1\dfrac{1}{y-x+1};

你可以通过 ! x 输出你认为正确的答案。

现在你要求出 qq。


设你的代价为 xx,你每个测试点获得的分数和你的总代价有如下关系(每个测试点满分 1010 分):

  • 若 x≤1.9813035x\le 1.9813035,则你可以得到 10 pts\text{10 pts};
  • 若 1.9813035<x≤121.9813035 < x \le 12,则你可以得到 $\lfloor(12-x)\times0.7 \div 1.00186965\rfloor \text{ pts}$。
  • 若 x≥12x\ge12,则你可以得到 0 pts\text{0 pts}。

需要注意的是,在每一次操作后,需要调用以下函数刷新缓存:

  • 对于 C/C++:fflush(stdout);
  • 对于 C++:std::cout << std::flush;
  • 对于 Java:System.out.flush();
  • 对于 Python:stdout.flush();
  • 对于 Pascal:flush(output);
  • 对于其他语言,请自行查阅对应语言的帮助文档。

交互格式

一开始交互库会给你 nn,

然后你可以按题目描述中的方式进行询问或回答答案;

在回答后请立即退出程序。

输入格式

见交互格式。

输出格式

见交互格式。

2

1 0
 

? 1 2

! 2
3

1 0

3 2
 

? 1 3

? 3 3

! 2

提示

  • 样例 11 解释:

    询问后发现 1<x≤21<x\le2,所以 x=2x=2;

  • 样例 22 解释:

    第一次询问后发现 1<x≤31<x\le3;

    第二次询问后发现 1<x<31<x<3,所以 x=2x=2;

【数据规模与约定】

测试点编号 n≤n \le 测试点编号 n≤n\le
1\texttt{1} 11 6\texttt{6} 2×1032\times 10^3
2\texttt{2} 77 7\texttt{7} 10410^4
3\texttt{3} 2020 8\texttt{8} 5×1045\times 10^4
4\texttt{4} 8080 9\texttt{9} 10510^5
5\texttt{5} 300300 10\texttt{10}

对于 100%100\% 的数据,1≤n≤1051\le n\le10^5,1≤q,∀u≤n1\le q,\forall u\le n,∀v∈{0,1,2}\forall v\in\{0,1,2\}。

保证每询问一次交互库时间是 O(1)\mathcal O(1) 的。