#P14479. [2025年广东省队集训]树上邻邻域数点
[2025年广东省队集训]树上邻邻域数点
题目描述
这是一道交互题。保证在询问合法的情况下,交互库占用运行时间不超过 500ms,空间不超过 128MB。因此你的程序运行时间不应超过 1500ms,空间不超过 896MB。
给你一棵 个点的树,节点编号为 ,点 有一个未知的整数点权 ,保证 。每次你可以给出整数 ,向交互库询问:在树上距离 恰为 的点中,有多少个点 满足 。你需要在不超过 次询问内求出每个点的点权。并且询问的 不小于给定的限制 。 保证不存在一个点的度数为 。定义树上两点的距离为两个点最短路径经过的边数。
输入格式
【实现细节】
选手不需要,也不应该实现 main 函数。
选手应确保提交的程序包含头文件 tree.h,可在程序开头加入以下代码实现:
#include "tree.h"
选手需要实现以下函数:
std::vector<int> tree(int N, std::vector<std::pair<int,int> > E,int M,int L);
- 表示树的节点个数。
- 表示树的边集,大小为 ,其中的元素 表示存在一条连接 和 的边;
- 表示询问次数限制。
- 表示询问的 的限制。
- 该函数需要返回长为 的数组 ,编号 ,其中 。
- 对于每个测试点,该函数会被交互库调用恰好 次。
选手可以通过调用以下函数向交互库发送一次询问:
int ask(int x, int d, int v);
- 你需要确保 ,,。
- 该函数会返回在树上距离 恰为 的点 中,满足 的点的个数。
【测试程序方式】
下发文件中的 template_tree.cpp 是一份示例代码,grader.cpp 是提供的交互库参考实现,最终测试时所用的交互库实现与该参考实现有所不同,因此选手的解法不应该依赖交互库的实现。
选手可以在本题目录下使用如下命令编译得到可执行程序:
g++ grader.cpp tree.cpp -o tree -O2 -std=c++14 -static
对于编译得到的可执行程序:
- 可执行文件将从标准输入读入以下格式的数据:
- 输入的第一行包含三个非负整数 ,表示树的节点个数和询问限制。
- 接下来一行输入一个非负整数 ,表示树的生成方式,如果 ,则接下来 行,每行读入两个数 ,表示树上的边。否则将会以 为 随机种子,对 随机生成 ,树上的每条边为 。
- 接下来一行输入一个非负整数 ,表示点权的生成方式,如果 ,则接下来一行读入 个数 ,第 个数为 ,表示 的点权。否则将会以 为 随机种子,对 随机生成 。
输出格式
无
说明/提示
【数据范围】
本题共有 个子任务。所有数据均满足 。
| 子任务编号 | 分数 | ||
|---|---|---|---|
其中,对于子任务 和子任务 ,有更特别的评分方式,假设你实际询问次数为 ,那么你可以获得的分数占该子任务满分的百分比为:
| 百分比 | |
|---|---|