题目描述
本题是一道交互题。
交互库想了一个整数 $a\in[1,n]$,你要在若干次询问内猜出这个整数。
具体地,你可以询问一个整数 $x$,交互库会告诉你 $x$ 和 $a$ 的大小关系。
但是,交互库玩原神去了,所以她会在你的第 $i$ 次询问回答你第 $i-d$ 次询问的结果。
交互方式
你不需要,也不应该实现主函数,你只需要实现以下函数:
long long find(long long n, int d);
该函数接受参数 $n$ 表示隐藏数字 $a$ 的上界,参数 $d$ 表示交互库的延迟参数。
该函数应当返回一个 $[1,n]$ 内的整数,表示你猜测的答案。
你可以调用以下函数作为询问:
int query(long long x);
该函数接受参数 $x$ 表示你的询问,会产生如下返回值:
假设这是你第 $i$ 次调用 query
函数,
当 $i\le d$ 时,返回 $0$;
当 $i>d$ 时,设你在第 $i-d$ 次调用 query
函数时传参为 $t$,当 $ta$ 时,返回 $1$;当 $t=a$ 时,返回 $0$。
选手可以参考下发文件中的 game.cpp
和 interactor.cpp
以更好地理解题意。
测试程序方式
选手可以在本题目录下使用以下命令得到可执行文件:
g++ interactor.cpp game.cpp -o game -std=c++14 -lm -Wl,--stack=0x40000000
按上述方法编译得到的可执行文件 game
,其运行方式如下:
该程序会在标准输入读入三个正整数 $n$,$d$,$a$,具体含义见题目描述。
需要注意的是选手需保证 $1\le n\le10^{18},1\le d\le100,1\le a\le n$,否则程序的运行结果将不可预知。
然后该程序会输出相应的结果信息。
评分方式
本题分为 $10$ 个测试点,每个测试点有 $5$ 个评分参数 $w_1,w_2,w_3,w_4,w_5$;
在每个测试点中,交互库会恰好调用 $T=10000$ 次 find
函数,如果你在某一次调用后没有返回正确的 $a$,那么你将在这个测试点中获得 $0$ 分的好成绩;
否则,记 $m$ 为你每次 find
函数中调用 query
函数次数的最大值,那么你将在这个测试点中获得 $2\sum\limits_{i=1}^5[m\le w_i]$ 分。
具体限制如下:
测试点编号 | $n=$ | $d=$ | $\{w_1,w_2,w_3,w_4,w_5\}=$ |
---|---|---|---|
$1$ | $10^3$ | $0$ | $\{9,9,9,10,10\}$ |
$2$ | $10^5$ | $1$ | $\{24,26,28,30,32\}$ |
$3$ | $10^6$ | $1$ | $\{28,30,33,36,38\}$ |
$4$ | $10^9$ | $2$ | $\{54,58,62,73,87\}$ |
$5$ | $10^9$ | $3$ | $\{65,70,76,87,116\}$ |
$6$ | $10^{18}$ | $5$ | $\{166,173,181,201,354\}$ |
$7$ | $10^{18}$ | $10$ | $\{247,269,291,315,377\}$ |
$8$ | $10^{18}$ | $20$ | $\{387,401,435,498,575\}$ |
$9$ | $10^{18}$ | $50$ | $\{741,760,779,798,1526\}$ |
$10$ | $10^{18}$ | $100$ | $\{1252,1289,1325,2187,3997\}$ |
需要注意的是,本题仍然受到传统题的限制,诸如编译错误、运行时错误、超出时间限制、超出空间限制等错误将导致你在对应的测试点得到 $0$ 分,所以请选手仔细注意自己的代码实现以避免上述错误。