题目:给出一棵树,边权在 [ 0 , 1 ] [0,1] [0,1]间随机,求直径长度的期望值。
1.枚举直径中点在那条边上。
直径中点落在点上的几率十分小,可以看做0.
所以我们枚举每一条边求直径中点在这条边上时的(概率*此时直径长度的期望)。
2.求出答案我们需要维护每个点到子树内的最长链的长度分布情况,
这个是个连续的量,我们需要用一个函数来描述他:
f u ( x ) = P r [ d ( u ) ≤ x ] f_u(x) = Pr[d(u)\leq x] fu(x)=Pr[d(u)≤x],
比如,对于1->2->3这样一个简单的两个点的树。
f 2 ( x ) = x , f 3 ( x ) = 1 f_2(x) = x , f_3(x) = 1 f2(x)=x,f3(x)=1
f 1 ( x ) f_1(x) f1(x)分成了两段,
在 x ∈ [ 0 , 1 ] x\in[0,1] x∈[0,1], f 1 ( x ) = x 2 2 f_1(x) = \frac {x^2}2 f1(x)=2x2
在 x ∈ [ 1 , 2 ] x\in[1,2] x∈[1,2], f 1 ( x ) = 2 x − x 2 2 − 1 f_1(x) = 2x-\frac {x^2}2-1 f1(x)=2x−2x2−1
所以简单的说我们的树形 D P DP DP中要维护的答案是一个个分段函数。
要如何转移呢?
需要两个操作,把儿子的函数加上一条边后取最长链即取 max \max max和加上一条边。
取 max \max max很简单, P r [ m a x ( a , b ) ≤ x ] = P r [ a ≤ x ] P r [ b ≤ x ] Pr[max(a,b)\leq x] = Pr[a\leq x] Pr[b\leq x] Pr[max(a,b)≤x]=Pr[a≤x]Pr[b≤x]
就是两个函数乘起来。(注意所有的函数都是在整数处分段,这为我们写代码提供了便利)。
加上一条边很好想出来: f ( x ) = ∫ x − 1 x g ( y ) d y f(x) = \int_{x-1}^{x}g(y)\rm{d} y f(x)=∫x−1xg(y)dy
表示前面的和 ≤ y \leq y ≤y,加入一个长为 x − y x-y x−y的边。
注意这虽然是一个定积分,但是其上下界与 x x x相关,所以其实是关于 x x x的一个函数,而通过定积分与 y y