Description
有一个\(n\)个点的以\(1\)为根的树,每个点至多有两个儿子。
对于每个叶子,他的权值事确定的,且两两不同。对于一个非叶子结点\(i\),他有一个系数\(p_i(0<p_i<1)\),满足有\(p_i\)的概率该点权值为子节点权值最大值,其他情况下为最小值。
那么我们会发现每种权值根节点都可能取到,假设有\(m\)种权值,第\(i\)小的权值为\(v_i\),\(v_i\)成为根节点权值的概率为\(d_i\)。那么求: \[ \sum_{i = 1}^m i\cdot v_i\cdot d_i^2 \] \(1\leq n\leq 300000, 0\leq v_i\leq 10^9\)。
Solution
从PKUWC开始,苦思冥想了很久,然后看到了一句每个点至多有两个儿子。
我想脱口而出一句μαλάκας。
考虑使用线段树来存储一个点所有可能的权值的概率。那么叶子很好处理,只有一个儿子的点只需要用儿子的树就行了,唯一麻烦的就是有两个儿子的点。
这个东西很显然可以线段树合并吧……注意到右边树第\(i\)小的概率\(p_i\)会发生如下变化: \[ p_i = p_i'(pS_{l, 1\ldots i - 1} + (1 - p)S_{l, i+1\ldots n}) \] 这里\(S_{l,a\ldots b}\)代表左边树本来\([a, b]\)这一段的和,\(p_i'\)代表变换前的\(p_i\),\(p\)就是这一个结点取最大的概率。
因此线段树合并的时候维护一下两边树分别在当前合并结点两侧的和就行了……
Code
1 |
|