#P17144. [NOI 2026] 木棉
[NOI 2026] 木棉
题目描述
故园中的那几棵木棉,仍旧生长在小 逐渐朦胧的记忆中。小 对故园的记忆,可以用一个长度为 的序列 表示。
故园中的每棵木棉,都形如一棵结点有标号的无根树。小 对一棵木棉的印象,可以用她的故园记忆的一个区间 描述:
- 这棵树的结点数目为 ,结点编号为 。
- $[\min(a_l,k-1),\min(a_{l+1},k-1),\ldots,\min(a_{r-1},k-1)]$ 是这棵树的 Prüfer 序列,其中 Prüfer 序列的定义详见【提示】一节。
在回忆往事时,小 也向你提出了 次询问。其中第 ()次询问为:
- 在故园记忆的区间 所对应的木棉上,结点 是否相邻?
【实现细节】
选手不需要,也不应该实现 main 函数。
选手需要确保提交的程序源文件包含头文件 kapok.h,即在程序开头加入以下代码:
#include "kapok.h"
选手需要在提交的程序源文件 kapok.cpp 中实现以下函数:
std::vector<bool> kapok(
int c, int n, int m, std::vector<int> a, std::vector<int> l, std::vector<int> r, std::vector<int> x, std::vector<int> y
);
- 分别表示测试点编号、故园记忆序列的长度、询问次数, 表示该测试点为样例。
- 表示故园记忆序列。
- 分别表示每次询问所给定的区间的两个端点。
- 分别表示每次询问所给定的两个结点的编号。
- 该函数需要返回一个长度恰好为 的序列 ,其中 ()表示第 次询问的结果。
- 对于每个测试点,该函数会被评测程序调用恰好一次。
本试题目录下的
template_kapok.cpp是提供的示例代码,选手可参考并实现自己的代码。
输入格式
【测试程序方式】
选手可以在本题目录下使用如下命令编译得到可执行文件:
g++ grader.cpp kapok.cpp -o kapok -O2 -std=c++14 -static
对于编译得到的可执行文件 kapok:
- 可执行文件将从标准输入读入以下格式的数据:
- 第一行包含三个非负整数 。
- 第二行包含 个非负整数 。
- 第 ()行包含四个非负整数 。
- 可执行文件将输出以下格式的数据至标准输出:
- 第 ()行包含一个非负整数,其中 表示 为
false, 表示 为true。
- 第 ()行包含一个非负整数,其中 表示 为
输出格式
无
输入输出样例 #1
输入 #1
0 8 3
2 0 2 6 0 7 2 2
0 3 0 2
3 5 1 2
0 0 0 1
输出 #1
1
0
1
说明/提示
【样例 解释】
- 区间 对应的树有 个结点,Prüfer 序列为 ,边集为 ,因此结点 相邻。
- 区间 对应的树有 个结点,Prüfer 序列为 ,边集为 ,因此结点 不相邻。
- 区间 对应的树有 个结点,Prüfer 序列为空,唯一一条边为 ,因此结点 相邻。
【样例 】
见选手目录下的 kapok/kapok2.in 与 kapok/kapok2.ans。
该样例满足测试点 的约束条件。
【样例 】
见选手目录下的 kapok/kapok3.in 与 kapok/kapok3.ans。
该样例满足测试点 的约束条件。
【数据范围】
对于所有测试数据,均有:
- 。
- 对于所有 ,均有 。
- 对于所有 ,均有 且 。
::cute-table{tuack}
| 测试点编号 | 特殊性质 | |
|---|---|---|
| 无 | ||
| ^ | ||
| 对于所有 ,均有 | ||
| ^ | 对于所有 ,均有 | |
| 对于所有 ,均有 | ||
| 对于所有 ,均有 | ||
| 对于所有 ,均有 | ||
| 无 | ||
| ^ |
特殊性质 :对于所有 ,在给定 后, 均从所有满足限制的有序点对中独立均匀随机生成。
【提示】
对于一棵结点编号为 ()的无根树 :
- 依次执行 次操作,其中第 ()次操作如下:
- 找出当前编号最小的叶子 。
- 记录其唯一相邻点的编号 。
- 然后从 中删去 及其唯一邻边。
- 如此得到的长度为 的序列 ,即为 的 Prüfer 序列。
附件下载 kapok.zip 566.91KB