#P14501. [2026年省队模拟联测]树

    ID: 13718 传统题 1000ms 1024MiB 尝试: 1 已通过: 1 难度: 7 上传者: 标签>CF2300图论二分DFS构造分治树的重心LCA

[2026年省队模拟联测]树

【题目描述】

这是一道交互题

现在有一棵树 TT

定义点集 SS最小覆盖为:TT 中最小的包含 SS 中所有点的连通块。不难发现这是唯一的。

给定树 TT 的大小 nn,你需要实现函数 std::vector<std::pair<int, int> > work(int n) 来还原出这棵树。你只能向交互库提出以下问题,交互库将返回保证正确的回答:

bool ask(std::vector<int> S, int x):对于树上的点集 SS 和点 xx,询问 xx 是否在 SS 的最小覆盖中。

注意,本题中树的节点编号从 11 开始。

【输入格式】

第一行一个正整数 nn 表示树的节点个数。

接下来 n1n - 1 行,每行两个正整数 u,vu, v 表示在树上两个编号为 u,vu, v 的节点之间有一条直接相连的边。

【输出格式】

若你成功返回了正确的树形态,样例交互库将会输出:

Correct! sum |S|=xxx, yyy Queries.

其中 xxx 为你询问的集合大小之和, yyy 为询问次数。

若你进行了一次不正确的询问,样例交互库将会输出以下内容并结束程序:

Wrong Query Format.

若你返回了错误的树形态,样例交互库将会输出以下内容并结束程序:

Wrong Answer.

【数据规模与约定】

子任务编号 子任务性质 子任务分值
11 n=100n=100 2020
22 n=200n=200
33 n=500n=500 3030
44 n=1000n=1000

评分方式

本题存在若干个测试点。对于某一个测试点,若你使用的询问次数为 xx 并且在所有询问均合法的情况下返回正确的树形态,则你会获得 $\min\left(\left\lfloor\frac{2.2\times 10^6}{x}\right\rfloor, 100\right)$ 的分数。而如果你的程序发出了不合法的询问,或者返回错误的树形态,你将获得 00 分。

如何编译运行

将你的答案代码(比如 tree.cpp)和样例交互库 sample_interactive_lib.cpp 放在同一目录下后,使用终端进入该目录,使用命令 g++ tree.cpp sample_interactive_lib.cpp -o run -O2 进行编译后,运行 run.exe 即可。

注意,样例交互库与正式测试的交互库实现不完全一致,但所有的返回值基本一致。