#CF2195E. Idiot First Search
Idiot First Search
题目描述
有一棵包含 个结点的二叉树( 为奇数),结点编号为 。每个结点上最多只能写一个字母,且一开始所有结点上都没有写任何东西。树的根结点是结点 。
在这棵树中,结点 是结点 的父亲,其余所有结点要么有 个孩子,要么没有孩子(叶子结点)。
Bob 迷路在树上的某个结点,希望通过到达结点 来离开这棵树。对大多数常人来说,这很简单。但不幸的是,Bob 是个“白痴”,于是他发明了一种新方式遍历这棵树,被称作“Idiot First Search”(白痴优先遍历)。
当 Bob 处于结点 ()时,他的移动方式如下:
- 如果结点 是叶子结点,Bob 始终移动到 的父亲;否则,根据后续条件判断。
- 如果结点 上没有任何字母,Bob 在 上写下 ‘L’,然后移动到 的左孩子;
- 如果 上写着 ‘L’,Bob 将其覆盖为 ‘R’,然后移动到 的右孩子;
- 如果 上写着 ‘R’,Bob 擦掉这个字母,然后移动到 的父节点。
Bob 每移动到相邻的下一个点正好花费 秒,因此执行 步就花去 秒。
已经证明,不论 Bob 起始于哪个结点,他都能在有限(可能非常大的)时间内到达结点 。我们不知道是谁证明的,反正肯定不是 Bob,但可以确信这一点。
对于每个点 ,请计算如果 Bob 从结点 出发,到达结点 所需的总用时(单位:秒)。由于答案可能很大,只需输出对 取模的结果。
输入格式
每组数据包含多组测试数据。第一行为测试组数 ()。每组测试数据描述如下:
每组测试数据的第一行包含一个正整数 (,且 为奇数)。
接下来 行,每行两个整数 与 ,表示第 个结点的左、右孩子()。
若结点 没有孩子,则给出 。否则, 和 分别表示结点 的左、右孩子。
保证每组数据表示的都是合法的二叉树,且满足题目所述所有条件。
保证所有测试数据中 的总和不超过 。
输出格式
对于每组测试数据,输出 个用空格分隔的整数 ,其中 表示如果 Bob 从结点 出发,到达结点 总共需要的时间,对 取模。
样例
3
1
0 0
5
2 3
0 0
4 5
0 0
0 0
7
2 3
4 5
0 0
6 7
0 0
0 0
0 0
1
9 10 14 15 15
13 22 14 27 23 28 28
样例说明
对于第一组样例,只有两个结点:结点 和结点 。Bob 从结点 走到结点 仅需 秒。
对于第二组样例,树的结构如下:

Bob 从结点 出发到达结点 需要 秒,具体过程如下:
$$3 \xrightarrow{\mathtt{L}} 4 \xrightarrow{\mathtt{X}} 3 \xrightarrow{\mathtt{R}} 5 \xrightarrow{\mathtt{X}} 3 \xrightarrow{\mathtt{X}} 1 \xrightarrow{\mathtt{L}} 2 \xrightarrow{\mathtt{X}} 1 \xrightarrow{\mathtt{R}} 3 \xrightarrow{\mathtt{L}} 4 \xrightarrow{\mathtt{X}} 3 \xrightarrow{\mathtt{R}} 5 \xrightarrow{\mathtt{X}} 3 \xrightarrow{\mathtt{X}} 1 \xrightarrow{\mathtt{X}} 0$$上方箭头边的字母表示 Bob 移动前结点上的状态,其中 表示未写任何内容。
由 ChatGPT 5 翻译
来源
Codeforces 2195E,英文题名 Idiot First Search。