#P14479. [2025年广东省队集训]树上邻邻域数点

    ID: 13696 传统题 文件IO:tree 2000ms 1024MiB 尝试: 1 已通过: 1 难度: 10 上传者: 标签>CF3300图论分治二分树状数组构造枚举杂项

[2025年广东省队集训]树上邻邻域数点

题目描述

这是一道交互题。保证在询问合法的情况下,交互库占用运行时间不超过 500ms,空间不超过 128MB。因此你的程序运行时间不应超过 1500ms,空间不超过 896MB。

给你一棵 NN 个点的树,节点编号为 0N10\sim N-1,点 ii 有一个未知的整数点权 aia_i,保证 0ai<320\le a_i<32。每次你可以给出整数 x,d,vx,d,v,向交互库询问:在树上距离 xx 恰为 dd 的点中,有多少个点 yy 满足 ayva_y\le v。你需要在不超过 MM 次询问内求出每个点的点权。并且询问的 dd 不小于给定的限制 LL 保证不存在一个点的度数为 N1N-1。定义树上两点的距离为两个点最短路径经过的边数。

输入格式

【实现细节】

选手不需要,也不应该实现 main 函数。 选手应确保提交的程序包含头文件 tree.h,可在程序开头加入以下代码实现:

#include "tree.h"

选手需要实现以下函数:

std::vector<int> tree(int N, std::vector<std::pair<int,int> > E,int M,int L);
  • NN 表示树的节点个数。
  • EE 表示树的边集,大小为 N1N-1,其中的元素 (u,v)(u,v) 表示存在一条连接 uuvv 的边;
  • MM 表示询问次数限制。
  • LL 表示询问的 dd 的限制。
  • 该函数需要返回长为 NN 的数组 retret,编号 0N10\sim N-1,其中 reti=airet_i=a_i
  • 对于每个测试点,该函数会被交互库调用恰好 11 次。

选手可以通过调用以下函数向交互库发送一次询问:

int ask(int x, int d, int v);
  • 你需要确保 0x<N0\le x<NLdNL\le d\le N0v<320\le v<32
  • 该函数会返回在树上距离 xx 恰为 dd 的点 yy 中,满足 ayva_y\le v 的点的个数。

【测试程序方式】

下发文件中的 template_tree.cpp 是一份示例代码,grader.cpp 是提供的交互库参考实现,最终测试时所用的交互库实现与该参考实现有所不同,因此选手的解法不应该依赖交互库的实现。

选手可以在本题目录下使用如下命令编译得到可执行程序:

g++ grader.cpp tree.cpp -o tree -O2 -std=c++14 -static

对于编译得到的可执行程序:

  • 可执行文件将从标准输入读入以下格式的数据:
    • 输入的第一行包含三个非负整数 N,M,LN,M,L,表示树的节点个数和询问限制。
    • 接下来一行输入一个非负整数 R1R_1,表示树的生成方式,如果 R1=0R_1=0,则接下来 N1N-1 行,每行读入两个数 u,vu,v,表示树上的边。否则将会以 R1R_1 为 随机种子,对 1i<N1\le i<N 随机生成 0fai<i0\le fa_i<i,树上的每条边为 (fai,i)(fa_i,i)
    • 接下来一行输入一个非负整数 R2R_2,表示点权的生成方式,如果 R2=0R_2=0,则接下来一行读入 NN 个数 ,第 ii 个数为 aia_i,表示 ii 的点权。否则将会以 R2R_2 为 随机种子,对 0i<N0\le i<N 随机生成 0ai<320\le a_i<32

输出格式

说明/提示

【数据范围】

本题共有 33 个子任务。所有数据均满足 N=50000N=50000

子任务编号 M=M= L=L= 分数
11 2.5×1052.5\times 10^5 00 1010
22 10610^6 11 3030
33 22 6060

其中,对于子任务 22 和子任务 33,有更特别的评分方式,假设你实际询问次数为 QQ,那么你可以获得的分数占该子任务满分的百分比为:

QQ 百分比
Q2.5×105Q\le 2.5\times 10^5 100100
2.5×105<Q3×1052.5\times 10^5<Q\le 3\times 10^5 80+(3×105Q)/250080+\lfloor(3\times 10^5-Q)/2500\rfloor
3×105<Q5×1053\times 10^5<Q\le 5\times 10^5 40+(5×105Q)/500040+\lfloor(5\times 10^5-Q)/5000\rfloor
5×105<Q1065\times 10^5<Q\le 10^6 (106Q)/12500\lfloor(10^6-Q)/12500\rfloor