Logo Universal Online Judge

UOJ

时间限制:1 s 空间限制:1024 MB
统计

题目描述

本题是一道交互题。

交互库想了一个整数 $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.cppinteractor.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$ 分,所以请选手仔细注意自己的代码实现以避免上述错误。