题⽬背景
法宝⽐赛进⾏太久,虽然道祖劝阻了他们对截教的围剿,但是原本万仙来朝,⾦碧辉煌的碧游宫现在也 已然是残垣断壁。你带领截教众⼈开始了对碧游宫的修缮。
题⽬描述
这是⼀道交互题。
你们本来准备按照原来的模样进⾏修缮,但是教主却设计了新的建造⽅案。然而却忘记画图纸了。
新⽅案碧游宫有 $n$ 个宝殿,由 $n - 1$ 条道路连接,互相可通过道路到达,也就是说可抽象为⼀棵树,宝殿为其中的节点,道路为边。
两个宝殿之间的距离定义为它们之间最短路径的道路条数。
万幸的是,教主设计⽅案的时候进⾏了实地考察,并在每个宝殿的准备建造位置安放了⼀块⽞妙的符⽂。向符⽂中注⼊整数 $d$ 后,符⽂可向所有距离⾃⼰小于等于 $d$(不包括⾃⼰)的宝殿的放出标记,同时每个宝殿可显⽰⾃⼰是否接收到了标记。
我们定义⼀次操作如下:
我们给每⼀个符⽂设定⼀个参数 $d$,然后整个碧游宫会开始运作,最后会返回每个宝殿是否接收到了标 记。
你是截教的头号军师,所以你应该在 $80$ 次操作之内求出通天教主的设计⽅案中各个宝殿之间的道路是 怎样的。
实现细节
请确保你的程序开头有 #include "rebuild.h"
。
你不需要也不应该实现主函数,你只需要实现如下函数:
void solve(int n);
你可以调⽤的程序接口如下:
std::vector<int> query(std::vector<int> d);
表⽰宝殿 $i$ 的符⽂的参数设为 $d_{i-1}$,保证返回的是⼀个⻓度为 $n$ 的只由 01 构成的 vector ,第 $i - 1$ 位表⽰第 $i$ 个宝殿是否接收到了标记。
保证交互器实现 query
函数的时间复杂度为 $O(n)$ 。
void report(std::vector<std::pair<int,int>>);
表⽰你求出来的教主的碧游宫设计⽅案。宝殿下标从 $1$ 开始。
测试程序⽅式
试题⽬录下的 grader.cpp
是我们提供的交互库参考实现,最终测试时所⽤的交互库实现与该参考实现
有所不同,但时间效率⼀致,选⼿的解法不应该依赖交互库实现。
你可以使⽤如下命令编译得到可执⾏程序:
g++ -o rebuild grader.cpp rebuild.cpp -g -lm -Wall -std=c++14 -O2��
编译得到的可执⾏程序将读⼊以下格式的数据:
第⼀⾏⼀个正整数 $n$,表⽰宝殿个数。
接下来 $n - 1$ ⾏,每⾏两个正整数 $u,v 1 \leq u,v \leq n$ 描述宝殿 $u$ 和宝殿 $v$ 之间有⼀条道路。
读⼊完成之后,交互库将调⽤恰好⼀次函数 solve
,你的函数正确返回后,交互库会判断你的计算是否正确,若正确则会输出交互函数调⽤次数相关信息,否则会输出相应的错误信息并退出。
若你的程序正确运⾏完毕,交互器会在最后输出 correct 和该测试点所⽤操作次数。
注意,我们提供的样例中, rebuild1.in
和 rebuild2.in
是不符合题⽬范围限制的,只是⽅便⼤家
理解题⽬。
评分⽅式
本题⾸先会受到和传统题相同的限制。例如编译错误会导致整道题⽬得 0 分,运⾏时错误、超过时间限 制、超过空间限制等会导致相应测试点得 0 分等。你只能访问⾃⼰定义的和交互库给出的变量及其对应 的内存空间,尝试访问其他空间将可能导致编译错误或运⾏错误。
若你调⽤ query
函数的次数为 x ,那么该测试点的分数 $f(x)$ 为
$$ f(x)= \begin{cases} \min \Big(100, \Big \lfloor \frac{6591 + 0.37}{1+(\frac{x}{0.79})^{0.9}} -0.37 \Big \rfloor \Big) &x \leq 1000 \\ 0 &x > 1000 \end{cases} $$
最终分数为所有测试点的分数的最小值。
大样例
数据范围与限制
时间限制 1000ms,空间限制 1024MB。保证交互库占⽤内存不超过 8MB。
对于 $100 \%$的数据,有 $n = 1000$ 。