#P11943. [KTSC 2025] 粒子对撞 / particles

[KTSC 2025] 粒子对撞 / particles

题目背景

版权信息:译自 2025年度 国际情报 올림피아드 (Olympiad) 代表学生 选拔考试 R1T2。[CC BY-NC-SA 4.0]

题目描述

本题中,下标默认为 0-index\textsf{0-index}

有一棵 nn 个节点的无根树,节点编号 0n10\sim {n-1}

现在 KOI 研究所开展了粒子碰撞试验。

初始时,每个节点上都没有粒子。

qq 次操作。每次操作给定 u,resultu,\mathrm{result},表示尝试在节点 uu 生成一个粒子,生成的结果为 result\mathrm{result}

  • 若生成成功(result=true\mathrm{result}=\mathrm{true}),uu 上将存在一个粒子。
  • 若生成失败(result=false\mathrm{result}=\mathrm{false}),uu 将被关闭,无法使用。

我们保证每个节点最多尝试生成 11 次。

一次碰撞实验流程如下:选择两个(不同的)节点 u,vu,v,满足:

  • u,vu,v 上存在粒子;
  • u,vu,v 路径上没有其他粒子存在;
  • u,vu,v 路径上没有被关闭的节点。

碰撞后,u,vu,v 上的粒子将被销毁。u,vu,v 之后可以出现在其他路径中。

在每次尝试生成后,你需要回答至多能够进行多少次碰撞实验。注意不会真的进行碰撞实验。

实现细节

你不需要,也不应该实现 main 函数。

你应当实现以下的函数:

void initialize(int n, std::vector<int> A, std::vector<int> B);

initialize 函数将在调用 generate 前被调用恰好一次。

  • nn:树的节点数量。
  • A,BA,B:长度为 (n1)(n-1) 的数组。0i<n1\forall 0\le i\lt n-1Ai,BiA_i,B_i 是树上第 ii 条边的两个端点。
int generate(int u, bool result);

表示一次尝试生成粒子的操作。

generate 函数将在 initialize 函数后调用恰好 qq 次。

  • uu:表示尝试在节点 uu 生成一个粒子。
  • result\mathrm{result}:生成的结果。
    • 若生成成功(result=true\mathrm{result}=\mathrm{true}),uu 上将存在一个粒子。
    • 若生成失败(result=false\mathrm{result}=\mathrm{false}),uu 将被关闭,无法使用。
  • 返回一个非负整数,表示在这次尝试后,至多能够进行多少次碰撞实验。

输入格式

Sample Grader 输入格式如下:

nn qq
A0A_0 B0B_0
A1A_1 B1B_1
\vdots
An2A_{n-2} Bn2B_{n-2}
u0u_0 result0\mathrm{result}_0
u1u_1 result1\mathrm{result}_1
\vdots
uq1u_{q-1} resultq1\mathrm{result}_{q-1}

这里,uiu_i 表示第 (i1)(i-1) 次尝试操作对应的节点,$\mathrm{result}_i\in \{\texttt{true},\texttt{false}\}$ 表示生成的结果。

输出格式

Sample Grader 输出 qq 行,每行一个非负整数,表示答案。

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

提示

样例交互 11

该样例中,n=6,q=5n=6,q=5A=[0,0,0,3,3]A=[0,0,0,3,3]B=[1,2,3,4,5]B=[1,2,3,4,5]。树的形态如图所示。

首先交互库调用

initialize(6, [0, 0, 0, 3, 3], [1, 2, 3, 4, 5]);

随后调用

generate(1, true);

节点 11 上成功生成了一个粒子。最多能够进行 00 次碰撞实验。

随后调用

generate(5, true);

节点 55 上成功生成了一个粒子。最多能够进行 11 次碰撞实验。

随后调用

generate(0, false);

节点 00 生成粒子失败,被关闭。由于路径不能经过 00,此时最多能够进行 00 次碰撞实验。

随后调用

generate(4, true);

节点 55 上成功生成了一个粒子。最多能够进行 11 次碰撞实验。

随后调用

generate(3, true);

节点 33 上成功生成了一个粒子。最多能够进行 11 次碰撞实验。

数据范围

  • 2qn2×1052\le q\le n\le 2\times 10^5
  • 给定的是一棵树。

子任务

  • Subtask 1 (9 pts)\text{Subtask 1 (9 pts)}2qn50002\le q\le n\le 5\, 000
  • Subtask 2 (16 pts)\text{Subtask 2 (16 pts)}0i<n1\forall 0\le i\lt n-1Ai=i,Bi=i+1A_i=i,B_i=i+1
  • Subtask 3 (20 pts)\text{Subtask 3 (20 pts)}:对于 generateresult=false 的调用至多有 2020 个。
  • Subtask 4 (23 pts)\text{Subtask 4 (23 pts)}:对于 generateresult=true 的调用至多有 2020 个。
  • Subtask 5 (32 pts)\text{Subtask 5 (32 pts)}:无额外约束。