luogu#P8111. [Cnoi2021] 区间
[Cnoi2021] 区间
题目背景
Cirno 有一个区间 ,而你的任务是在规定的次数内帮 Rumia 猜出这个区间。
每次,你可向 Cirno 询问一个数字 ,而 Cirno 会告诉你这个数字与区间 的关系。
题目描述
为了猜到这个区间,你需要实现一个函数 std::pair<int,int> Guess(int n,int c)
,这个函数的作用是在不超过 次询问中猜对 中的一个子闭区间 ,返回值为你最终确定的区间,以 std::pair<int,int>
的形式返回。
你可以调用交互库中一个叫做 Query
的函数,其原型为 int Query(int x)
,返回值为:
- 若 ,返回 。
- 若 ,返回 。
- 若 ,返回 。
你调用 Query
函数的次数不超过 才能得到这个点的分数,否则这个点为 分。有关该函数的调用请参考「说明/提示」部分。
在一个测试点中,你的 Guess
函数可能被调用多次,最多不超过 次。为了保证你的程序不会超时,你需要额外实现一个函数 void init()
,这个函数只会在开始时被交互库调用一次。当然,它的实现可以为空。
由于 Rumia 的编译器只支持 C++,所以你只能使用 C++ 语言(包括 C++,C++11,C++14,C++17)来解决本题。
输入格式
样例中输入四个数字 ,,,。这些数字你无法读取。
输出格式
样例中给输出三个数字 ,,。分别表示你猜的区间与 Query
调用测次数。这些你不用输出。
5 2 3 5
2 3 0
提示
样例解释
需要求的区间是 ,区间左右端点可能的范围是 ,你最多猜 次。
数据范围与约定
对于所有数据保证 ;除 SubtaskExtra 外,保证 。
子任务
Subtask1( points):。
Subtask2( points):。
Subtask3( points):。
Subtask4( points):。
附加任务
SubtaskExtra( point):,$c=\lfloor\log_2 n\rfloor+\lfloor\log_2 \frac{4n}{3}\rfloor$。
本题使用 Special Judge, 与 分均视作 Accepted.
提示
如果你不知道怎么解决交互题,可以参考这题。
本题模板程序与模板交互库见附件中的 SampleProgram.cpp
与 SampleInteractor.cpp
。