https://www.lydsy.com/JudgeOnline/problem.php?id=5461
看到题目,必将m种权值离散化。
首先是一个显然的dp设计。
设$f(i,j)$表示第i个节点,最终取值为j(已离散化)的概率。
因为树上的节点儿子数不超过2,不妨设值k出现在左儿子上。
则有$f(x,k)=f(ls,k)*(pmx_x*sum limits_{j=1}^{k-1}f(rs,j)+pmn_x*sum limits_{j=k+1}^{m}f(rs,j))$
初态是$f(leaf,val[leaf])=1$,答案直接对$f(1)$统计即可。
从实际含义上理解,正确性是显然的。
所以dp前预处理前缀和,可以做到$O(n^2)$。
因为树上情况比较特殊,加上保证只有不超过两个儿子,并不自然地想到了线段树合并。
如果是叶子,插入权值为1的节点。
否则进行两个儿子的线段树合并。
在线段树合并的同时,维护两棵线段树当前子树的前缀后缀和。
如果递归到其中一棵树为空,给另一棵树打上乘一个值的标记就可以了。
最后$dfs(root[1])$统计答案。
该题复杂度为$O(mlogn)$,
证明:
线段树合并复杂度等于$merge$函数调用次数。
$merge$函数调用一次,除非遇到(线段树上的)叶子节点,必定销毁一个节点。
并且,线段树是二叉树,
也就是说遇到的(线段树上的)叶子节点个数不会多于销毁的节点个数。
只在遇到(题中树上的)叶子节点时插入了$mlogn$个节点,故得证。