luogu#P7445. 「EZEC-7」线段树
「EZEC-7」线段树
题目背景
Bob 喜欢线段树。
题目描述
如果你不知道线段树,可以看 提示说明 中的定义。
Bob 得到了一个长度为 的序列 ,初始全为 。
接着 Bob 进行了 次区间加操作,每次操作会等概率地从 的所有 个子区间中随机选择一个进行操作,每次加的数是 之间等概率随机的整数。
次操作完之后要求出每一个位置的值。
由于 Bob 喜欢线段树,他熟练地打出一颗 上的线段树来解决这个问题,使用懒惰标记来解决区间加的问题。
打代码的过程中 Bob 忽然想到了两个减小 (下传懒惰标记)次数的方法:
-
修改的时候不 ,最后一次性 (即 函数)。
-
到一个节点的时候,如果这个节点的懒惰标记为 那么不 。
现在 Bob 想知道期望 次数,可是他不会算,于是来问你。
下面是 Bob 写的线段树伪代码(其中 tag
数组为懒惰标记):
$ \displaystyle \begin{array}{l} \mathrm{pushdown\_counter}\leftarrow 0\\ \\ \textbf{function }\mathrm{Update(Node},l,r,ql,qr,Delta)\\ \qquad \textbf{if } [l,r]\cap [ql,qr] = \varnothing \textbf{ then}\\ \qquad \qquad \textbf{return}\\ \qquad \textbf{end if}\\ \qquad \textbf{if }[l,r] \subseteq [ql,qr] \textbf{ then}\\ \qquad \qquad \mathrm{tag[Node]\leftarrow tag[Node]}+Delta\\ \qquad \qquad \textbf{return}\\ \qquad \textbf{end if}\\ \qquad mid\leftarrow \lfloor\dfrac{l+r}{2}\rfloor\\ \qquad \mathrm{Update(LeftChild},l,mid,ql,qr,Delta)\\ \qquad \mathrm{Update(RightChild},mid+1,r,ql,qr,Delta)\\ \textbf{end function}\\ \\ \textbf{function }\mathrm{Pushdown(Node)} \\ \qquad \mathrm{tag[LeftChild]\leftarrow tag[LeftChild]+tag[Node]}\\ \qquad \mathrm{tag[RightChild]\leftarrow tag[RightChild]+tag[Node]}\\ \qquad \mathrm{pushdown\_counter}\leftarrow \mathrm{pushdown\_counter}+1\\ \textbf{end function}\\ \\ \textbf{function }\mathrm{Pushall(Node},l,r)\\ \qquad \textbf{if } \mathrm{Node\ is\ Leaf} \textbf{ then}\\ \qquad \qquad \textbf{return}\\ \qquad \textbf{end if}\\ \qquad \textbf{if } \mathrm{tag[Node] \not= 0} \textbf{ then}\\ \qquad \qquad \mathrm{Pushdown(Node)}\\ \qquad \textbf{end if}\\ \qquad mid\leftarrow \lfloor\dfrac{l+r}{2}\rfloor\\ \qquad \mathrm{Pushall(LeftChild},l,mid)\\ \qquad \mathrm{Pushall(RightChild},mid+1,r)\\ \textbf{end function} \end{array} $
换句话说,你要帮 Bob 求出 pushdown_counter
的期望值。
答案对 取模。
输入格式
一行三个整数 。
输出格式
一个整数,期望 次数对 取模的结果。
2 1 0
166374059
2 2 1
813384288
3 2 1
462150164
100 114 514
718571152
提示
【样例解释 #1】
整颗线段树只有 个节点:。
只有节点 可能 。
当操作为 的时候,根节点的懒惰标记为 , 在根号节点会 ;而 之后,由于根节点懒惰标记为 不 。
其余 种操作均把懒惰标记打在叶子节点,即 $\mathrm{Update(1,1,-1)},\mathrm{Update(1,1,0)},\mathrm{Update(2,2,-1)},\mathrm{Update(2,2,0)}$,不会 。
所以,总共 种情况,能 的只有 种,期望次数为 。
【样例解释 #2】
由于情况过多,不一一解释,只解释一种情况。
如果执行的 次操作分别为 ,由于这时候根节点的懒惰标记为 ,在 的时候仍然不会 。
【数据范围】
本题采用捆绑测试。
子任务编号 | 分值 | 时间限制 | |||
---|---|---|---|---|---|
对于 的数据,,,。
【线段树定义】
线段树是一棵每个节点上都记录了一个线段的二叉树。根节点记录的线段是 。对于每个节点,若它记录的线段是 且 ,取 ,则它的左右儿子节点记录的线段分别是 和 ;若 ,则它是叶子节点。