#P11943. [KTSC 2025] 粒子对撞 / particles
[KTSC 2025] 粒子对撞 / particles
题目背景
版权信息:译自 2025年度 国际情报 올림피아드 (Olympiad) 代表学生 选拔考试 R1T2。[CC BY-NC-SA 4.0]
题目描述
本题中,下标默认为 。
有一棵 个节点的无根树,节点编号 。
现在 KOI 研究所开展了粒子碰撞试验。
初始时,每个节点上都没有粒子。
有 次操作。每次操作给定 ,表示尝试在节点 生成一个粒子,生成的结果为 。
- 若生成成功(), 上将存在一个粒子。
- 若生成失败(), 将被关闭,无法使用。
我们保证每个节点最多尝试生成 次。
一次碰撞实验流程如下:选择两个(不同的)节点 ,满足:
- 上存在粒子;
- 路径上没有其他粒子存在;
- 路径上没有被关闭的节点。
碰撞后, 上的粒子将被销毁。 之后可以出现在其他路径中。
在每次尝试生成后,你需要回答至多能够进行多少次碰撞实验。注意不会真的进行碰撞实验。
实现细节
你不需要,也不应该实现 main
函数。
你应当实现以下的函数:
void initialize(int n, std::vector<int> A, std::vector<int> B);
initialize
函数将在调用 generate
前被调用恰好一次。
- :树的节点数量。
- :长度为 的数组。, 是树上第 条边的两个端点。
int generate(int u, bool result);
表示一次尝试生成粒子的操作。
generate
函数将在 initialize
函数后调用恰好 次。
- :表示尝试在节点 生成一个粒子。
- :生成的结果。
- 若生成成功(), 上将存在一个粒子。
- 若生成失败(), 将被关闭,无法使用。
- 返回一个非负整数,表示在这次尝试后,至多能够进行多少次碰撞实验。
输入格式
Sample Grader 输入格式如下:
这里, 表示第 次尝试操作对应的节点,$\mathrm{result}_i\in \{\texttt{true},\texttt{false}\}$ 表示生成的结果。
输出格式
Sample Grader 输出 行,每行一个非负整数,表示答案。
6
0 1
0 2
0 3
3 4
3 5
1 true
5 true
0 false
4 true
3 true
0
1
0
1
1
提示
样例交互
该样例中,,,。树的形态如图所示。
首先交互库调用
initialize(6, [0, 0, 0, 3, 3], [1, 2, 3, 4, 5]);
随后调用
generate(1, true);
节点 上成功生成了一个粒子。最多能够进行 次碰撞实验。
随后调用
generate(5, true);
节点 上成功生成了一个粒子。最多能够进行 次碰撞实验。
随后调用
generate(0, false);
节点 生成粒子失败,被关闭。由于路径不能经过 ,此时最多能够进行 次碰撞实验。
随后调用
generate(4, true);
节点 上成功生成了一个粒子。最多能够进行 次碰撞实验。
随后调用
generate(3, true);
节点 上成功生成了一个粒子。最多能够进行 次碰撞实验。
数据范围
- ;
- 给定的是一棵树。
子任务
- :。
- :,。
- :对于
generate
,result=false
的调用至多有 个。 - :对于
generate
,result=true
的调用至多有 个。 - :无额外约束。