出题

买买买

题目大意

一个永生的家族里面有 \(n\) 个人,它们的祖先后代关系组成了一个树的结构。

这个家族里面的人都很喜欢买东西!但一个人的力量是微小的,每个人要买东西的时候会向自己的所有后代筹钱(当然自己也出钱)。

一次筹钱可以这样定义:一个节点首先收到所有儿子节点筹到的钱,然后他会想办法去银行借钱,使钱变为原来的 \(b\) 倍。此时他放入自己的 \(a\) 元。最后若这个点不是发起筹钱的节点,它就把这些钱交给自己的父亲节点。(不考虑向银行还钱)

筹钱可能有多次,银行能借出的钱的倍数是一定的,每一个时刻所有人能拿出的钱 \(a\) 是相同的,但对于不同的时刻, \(a\) 可能不同。

当然,这个家族不是一成不变的。虽然没有人死亡,但可能有人出生。一共出生了 \(m\) 个新的节点。

请你对于每次筹钱,求出筹到的总钱数。这个家族的人都很聪明谨慎,他们只是想让你写个程序帮忙验证一下。所以请输出答案 \(\bmod\ 998244353\) 后的结果。

形式化题面:

给出一个 \(n\) 个点的有根树,根为 \(1\)
\(q\) 个时刻,每个时刻可能发生两种事件:

  1. \(x\) 节点多了一个后代。这个后代的编号为\(n+1\),随后令\(n\gets n+1\)

  2. 对于 \(x\) ,计算 \(\large f_x\)\(\large f_x=a+b\sum\limits_{y \in son[x]}f_y\) 并输出。

其中增加的总点数为 \(m\)

输入格式

第一行三个数,\(n,m,b\),意义见题面。

第二行 \(n-1\) 个数,表示 \(i\) 节点的父亲。

随后一行一个数 \(q\),代表 \(q\) 个事件。

之后的 \(q\) 行,每行可能是以下两种情况

\(1\ x\),表示 \(x\) 节点多了一个新的儿子节点。

\(2\ x\ a\),表示筹钱。

输出格式

对于每一个 \(2\) 操作,输出能筹到的钱 \(\bmod\ 998244353\) 的结果。

数据范围

文中所有出现的数字均为非负整数。

对于 \(30\%\) 的数据,满足 \(1\le n+m, q\le 2 \times 10^3\)

另外 \(5\%\) 的数据,满足 \(b=1\)

另外 \(10\%\) 的数据,满足 \(m=0\)

另外 \(15\%\) 的数据,满足任何时刻,对于任意 \(i > 1\)\(i\) 的父亲是 \(i-1\)。也就是说,任意时刻树的形态都是一条链。

对于 \(80\%\) 的数据,满足 \(1\le n+m, q\le 3 \times 10^5\)

对于 \(100\%\) 的数据,满足 \(1\le n,m, q\le5 \times10^5 , 1\le a, b < 998244353\)

PS:请熊老师开大栈空间,谢谢。

posted @ 2021-08-23 20:13  Martin_MHT  阅读(13)  评论(0)    收藏  举报