Logo Universal Online Judge

UOJ

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

#2632. 战后重建

统计

题⽬背景

法宝⽐赛进⾏太久,虽然道祖劝阻了他们对截教的围剿,但是原本万仙来朝,⾦碧辉煌的碧游宫现在也 已然是残垣断壁。你带领截教众⼈开始了对碧游宫的修缮。

题⽬描述

这是⼀道交互题

你们本来准备按照原来的模样进⾏修缮,但是教主却设计了新的建造⽅案。然而却忘记画图纸了。

新⽅案碧游宫有 $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.inrebuild2.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$ 。