CFCF2195E.Idiot First Search
普及/提高-
通过率:0%
AC君温馨提醒
该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。
题目描述
有一棵包含 n+1 个结点的二叉树(n 为奇数),结点编号为 0,1,…,n。每个结点上最多只能写一个字母,且一开始所有结点上都没有写任何东西。树的根结点是结点 0。
在这棵树中,结点 0 是结点 1 的父亲,其余所有结点要么有 2 个孩子,要么没有孩子(叶子结点)。
Bob 迷路在树上的某个结点,希望通过到达结点 0 来离开这棵树。对大多数常人来说,这很简单。但不幸的是,Bob 是个“白痴”,于是他发明了一种新方式遍历这棵树,被称作“Idiot First Search”(白痴优先遍历)。
当 Bob 处于结点 v(1≤v≤n)时,他的移动方式如下:
- 如果结点 v 是叶子结点,Bob 始终移动到 v 的父亲;否则,根据后续条件判断。
- 如果结点 v 上没有任何字母,Bob 在 v 上写下 ‘L’,然后移动到 v 的左孩子;
- 如果 v 上写着 ‘L’,Bob 将其覆盖为 ‘R’,然后移动到 v 的右孩子;
- 如果 v 上写着 ‘R’,Bob 擦掉这个字母,然后移动到 v 的父节点。
Bob 每移动到相邻的下一个点正好花费 1 秒,因此执行 x 步就花去 x 秒。
已经证明,不论 Bob 起始于哪个结点,他都能在有限(可能非常大的)时间内到达结点 0。我们不知道是谁证明的,反正肯定不是 Bob,但可以确信这一点。
对于每个点 k=1,2,…,n,请计算如果 Bob 从结点 k 出发,到达结点 0 所需的总用时(单位:秒)。由于答案可能很大,只需输出对 109+7 取模的结果。
输入格式
每组数据包含多组测试数据。第一行为测试组数 t(1≤t≤104)。每组测试数据描述如下:
每组测试数据的第一行包含一个正整数 n(1≤n≤300001,且 n 为奇数)。
接下来 n 行,每行两个整数 li 与 ri,表示第 i 个结点的左、右孩子(0≤li,ri≤n)。
若结点 i 没有孩子,则给出 li=ri=0。否则,li 和 ri 分别表示结点 i 的左、右孩子。
保证每组数据表示的都是合法的二叉树,且满足题目所述所有条件。
保证所有测试数据中 n 的总和不超过 300001。
输出格式
对于每组测试数据,输出 n 个用空格分隔的整数 τ1,τ2,…,τn,其中 τk 表示如果 Bob 从结点 k 出发,到达结点 0 总共需要的时间,对 109+7 取模。
输入输出样例
输入#1
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
1 9 10 14 15 15 13 22 14 27 23 28 28
说明/提示
对于第一组样例,只有两个结点:结点 0 和结点 1。Bob 从结点 1 走到结点 0 仅需 1 秒。
对于第二组样例,树的结构如下:

Bob 从结点 3 出发到达结点 0 需要 14 秒,具体过程如下:
3L4X3R5X3X1L2X1R3L4X3R5X3X1X0
上方箭头边的字母表示 Bob 移动前结点上的状态,其中 X 表示未写任何内容。