[PKUWC2018]Minimax
小 \(C\) 有一棵 \(n\) 个结点的有根树,根是 \(1\) 号结点,且每个结点最多有两个子结点。
定义结点 \(x\) 的权值为:
1.若 \(x\) 没有子结点,那么它的权值会在输入里给出,保证这类点中每个结点的权值互不相同。
2.若 \(x\) 有子结点,那么它的权值有 \(p_x\) 的概率是它的子结点的权值的最大值,有 \(1-p_x\) 的概率是它的子结点的权值的最小值。
现在小 \(C\) 想知道,假设 \(1\) 号结点的权值有 \(m\) 种可能性,权值第 \(i\) 小的可能性的权值是 \(V_i\),它的概率为 \(D_i(D_i>0)\),求:
你需要输出答案对 \(998244353\) 取模的值。
solution
每个结点值能且仅能取到它子树中的所有叶子结点的值。因此我们只需要考虑如何计算每个取值的概率。
考虑一个dp,\(f_{i,j}\)表示第i个结点取到第j小值的概率。
可以很容易得到转移方程\(f_{i,j} = f_{ls[i],j} * (\sum_{k = 1} ^{j-1} {f_{rs[i],k}} * p + \sum_{k = j + 1} ^{cnt} {f_{rs[i],k}} * (1-p)) + f_{rs[i],j} * (\sum_{k = 1}^{j-1} {f_{ls[i],k}} * p + \sum_{k=j+1}^{cnt} {f_{ls[i],k}} * (1-p))\)
本题的精妙之处在于用线段树合并维护了这样的转移。我看到这个式子感觉需要枚举j来转移,感觉没什么好方法。
但是这个转移方程有非常好的性质:左右儿子不能同时取到j小值,这样使得我们在线段树合并的时候,走到最底层的时候一定是某个线段树有结点而另一个没有。
考虑从叶子开始对每个点开一棵权值线段树(动态开点),然后对非叶子结点合并他的两个叶子结点。
在合并的过程中如果维护前缀和后缀和,当(x && !y) 或者(y && !x)时,说明在这个区间内已经不能继续产生转移了(这里不是很会表达)就打标记。
这样做感觉还是很暴力,但是复杂度大大降低了
线段树合并复杂度

浙公网安备 33010602011771号