#P14865. [OOI2025 资格赛]Classic Tree Problem经典树问题
[OOI2025 资格赛]Classic Tree Problem经典树问题
提示
这不是普通输入输出题。若配置到 Hydro,应作为“提交函数题”处理:选手实现 solve,不写 main,由 grader.cpp 负责读入和输出。题面应在开头明确这一点。
题目描述
一天早上,Egor 走到外面,看见沥青地上画着经典的跳房子方格:一共有 个方格,每个方格里写着一些数字,第 个方格里写着数字 。不过这些并不是普通方格,每个方格还与一些其他方格相连。
跳房子游戏从某个方格开始,每次跳到一个与当前方格相连的方格,并且不能重复跳到同一个方格。游戏可以在任意时刻结束。访问过的方格序列
称为一次跳跃序列。
地上的方格连接关系构成一棵树,因此任意两个方格之间只有唯一一条路径。
跳跃序列的“酷炫度”定义为满足
的下标 的数量。
Egor 想知道对于一些方格对 ,从 跳到 的跳跃序列有多酷,以判断是否值得这么跳。
不过 Egor 经常被打断。因此他有时会擦掉第 个方格中的数字,并写上一个新数字 。由于数数对 Egor 来说很困难,他向你寻求帮助。
接下来的 分钟中,你需要帮助 Egor 回答关于跳跃酷炫度的问题。第 分钟,Egor 会进行以下两种操作之一:
- 擦掉方格 中的数字,并写入数字 ;
- 询问从方格 到方格 的跳跃序列酷炫度。
你需要回答 Egor 的每个询问。
提交格式
这是一个非传统题,采用 grader 测试格式。你只需要在提交文件中实现函数 solve。该函数会由评测程序调用,函数返回值会作为本题答案。
也就是说,提交代码中不应进行输入输出。如果使用 C++,代码中不能包含 main 函数。可以实现任意数量的辅助函数、结构体、类和全局变量,但全部解题代码必须在一个文件中。
C++ 需要实现如下函数:
std::vector<int> solve(
int n,
int q,
std::vector<int> a,
std::vector<int> p,
std::vector<int> qt,
std::vector<int> qx,
std::vector<int> qy
);
Python3 或 PyPy3 需要实现如下函数:
def solve(n, q, a, p, qt, qx, qy):
其中 为整数; 为长度为 的整数列表; 为长度为 的整数列表。
注意,原题不保证 Python3 或 PyPy3 可以获得满分。
函数参数含义如下:
- ():方格数量。
- ():询问数量。
- ():长度为 的数组,表示方格中初始写着的数字。
- ():长度为 的数组。若把跳房子方格看作一棵有根树, 表示方格 的父亲;根节点的 为 。保证该数组定义了一棵合法的树。
- ():长度为 的数组,表示询问类型。
- :定义询问内容的数组。
对于每个 ,第 个询问如下:
- 如果 ,则表示擦掉编号为 的方格中的数字,并写入 。此时满足 ,。
- 如果 ,则表示询问从方格 到方格 的跳跃序列酷炫度。此时满足 。
所有方格和询问均从 开始编号。
函数 solve 返回一个整数数组,包含所有第二类询问的答案。数组长度应等于第二类询问数量。C++ 中返回类型为 vector<int>,Python3 中返回列表。
保证程序执行过程中 solve 恰好被调用一次。
本地测试说明
原题提供模板文件 tree.cpp 与 tree.py。对于 C++,还提供头文件 tree.h,其中包含函数 solve 的定义。
同时提供 grader 文件 grader.cpp 和 grader.py,其中实现了从标准输入读入数据、调用 solve、输出返回值。在正式评测系统中,grader 文件可能不同。
若要编译写在 tree.cpp 中的 C++ 代码,可使用:
g++ -std=c++20 grader.cpp tree.cpp -o grader
运行后会生成名为 grader 或 grader.exe 的可执行文件。
如果直接复制 grader 中的输入输出代码到自己的文件中用于本地测试,正式提交前必须删去这些输入输出实现,尤其是 C++ 中的 main 函数。
Grader 输入格式
提供的 grader 按如下格式读取测试数据。
第一行包含两个整数 (),表示跳房子方格数量和 Egor 的操作数量。
第二行包含 个整数 (),表示方格中的初始数字。
第三行包含 个整数 (),表示树中每个节点的父亲。若 ,则节点 是根;否则 是节点 的父亲。保证该父亲数组形成一棵合法有根树。
接下来 行描述询问。对于任意 ,第 个询问根据类型按如下格式给出:
1 s x(,):Egor 擦掉方格 中的数字并写入 。在solve参数中,满足 。2 u v():Egor 询问从 到 的跳跃序列酷炫度。 在solve参数中,满足 。
Grader 输出格式
grader 输出函数 solve 的结果,即所有第二类询问的答案。
样例 1
4 3
1 1 2 2
-1 0 0 2
2 0 3
1 2 1
2 0 3
1
2
样例 2
5 5
0 1 2 3 4
1 2 -1 2 3
2 0 4
1 0 1
1 1 0
2 0 4
2 1 0
5
3
2
样例解释
在样例中,输入输出为 grader 使用的数据格式。
第一个样例中的树形结构如下:

以 为根, 与 为 的儿子, 为 的儿子。
对于第一个询问,考虑从 到 的跳跃序列:
- ,,因此该方格不增加酷炫度。
- ,,因此也不增加酷炫度。
- ,,该跳跃是酷炫的。
因此第一个询问的酷炫度为 。
第二个询问后,方格 中的数字变为 。因此第二次询问中,跳到方格 也变得酷炫,答案变为 。
评分方式
本题测试点由 14 个分组组成。只有通过某一组及其要求的部分前置分组时,才能获得该组分数。注意,部分分组不要求通过样例。Offline-testing 表示该组测试结果只会在比赛结束后给出。
设 为与第 个方格相连的方格数量。
| 组别 | 分数 | 附加限制: | 附加限制: | 依赖分组 | 说明 |
|---|---|---|---|---|---|
| 0 | - | 样例 | |||
| 1 | 10 | 0 | - | ||
| 2 | 11 | 0,1 | |||
| 3 | 14 | - | 没有第一类询问 | ||
| 4 | 5 | 恰有一个方格满足 ,其他方格满足 | |||
| 5 | 11 | ||||
| 6 | 10 | 所有第二类询问均满足 | |||
| 7 | 9 | 0,1 | - | ||
| 8 | 0–7 | ||||
| 9 | 17 | 0–8 | |||
| 10 | 1 | 0–9 | Offline-testing | ||
| 11 | 0–10 | ||||
| 12 | 0–11 | ||||
| 13 | 0–12 | ||||
| 14 | - | 0–13 | |||