| 题目名称 | 4391. 粒子对撞 |
|---|---|
| 输入输出 | nuclear.in/out |
| 难度等级 | ★★★ |
| 时间限制 | 5000 ms (5 s) |
| 内存限制 | 1024 MiB |
| 测试数据 | 10 |
| 题目来源 |
|
| 开放分组 | 全部用户 |
| 提交状态 | |
| 分类标签 | |
| 分享题解 |
| 通过:1, 提交:1, 通过率:100% | ||||
|
|
100 | 7.164 s | 32.10 MiB | C++ |
| 本题关联比赛 | |||
| 2026.4.11 | |||
| 关于 粒子对撞 的近10条评论(全部评论) |
|---|
这是一道交互题。Test
小 H 和小 L 正在玩一个粒子碰撞的游戏。游戏在包含 $n$ 个节点的无根树上进行,节点编号为 $0 \sim n-1$。
初始时,每个节点上都没有粒子。游戏共有 $q$ 次操作,每次操作给定 $u, \mathrm{result}$,表示尝试在节点 $u$ 生成一个粒子:
我们保证每个节点最多尝试生成 $1$ 次。
一次碰撞实验流程如下:选择两个(不同的)节点 $u, v$,满足:
碰撞后,$u, v$ 上的粒子将被销毁。$u, v$ 节点本身在粒子销毁后变为空节点,之后可以出现在其他路径中。
在每次尝试生成后,小 L 需要回答当前状态下至多能够进行多少次碰撞实验。注意:小 L 只需要计算理论上的最大次数,并不需要真正模拟碰撞销毁过程。
选手不需要,也不应该实现 main 函数。
选手需要确保提交的程序包含头文件 nuclear.h,即在程序开头加入以下代码:
#include "nuclear.h"
选手需要在提交的程序源文件 nuclear.cpp 中实现以下两个函数:
void initialize(int n, std::vector<int> A, std::vector<int> B);
int generate(int u, bool result);
可执行文件将从标准输入读入以下格式的数据:
6 5 0 1 0 2 0 3 3 4 3 5 1 1 5 1 0 0 4 1 3 1
0 1 0 1 1
树的形态:$0$ 与 $1, 2, 3$ 相连,$3$ 与 $4, 5$ 相连。
generate(1, true):只有 1 个粒子,返回 0。
generate(5, true):粒子在 $\{1, 5\}$,路径 $1-0-3-5$ 通畅,返回 1。
generate(0, false):节点 0 关闭,阻断了 1 和 5 的路径,返回 0。
generate(4, true):连通块 $\{3, 4, 5\}$ 中有粒子 $\{4, 5\}$,返回 1。
generate(3, true):粒子增加但最大碰撞数仍为 1,返回 1。
对于所有测试数据,均有 $2\le q\le n\le 2\times 10^5$。
| 子任务编号 | 分值 | 特殊性质 |
|---|---|---|
| 1 | 20 | $n, q \le 5000$ |
| 2 | 10 | 树退化为一条链 |
| 3 | 10 | $\mathrm{result}=\mathrm{false}$ 的操作 $\le 20$ 次 |
| 4 | 10 | $\mathrm{result}=\mathrm{true}$ 的操作 $\le 20$ 次 |
| 5 | 50 | 无额外约束 |