这也是我能干的出来的题吗。我们记题面中的 xu 为 hu。
求出 hu 是一个经典的换根 DP 问题,考虑先求出 gu 表示以 1 为根时 u 子树内包含 u 的连通块的最大权值,然后再进行换根。
对于 g,有转移式 gu=au+∑v∈son(u)max(gv,0)。考虑一种情况合法(这里指 ∀u,0≤hu≤1)的一个必要条件是对于所有的 1<u≤n,都有 ∣gu∣≤1,且 0≤g1≤1。相应的,如果 u=1,我们称 gu 的合法区间为 [0,1],否则为 [−1,1]。
考虑证明,首先由于 h1=g1,0≤g1≤1 是显然的;而对于 u>1,gu≤1 是显然的,因为 gu≤hu;至于 gu≥−1 是因为我们有 hu=gu+x≥0,其中 x 是 u 子树外面的那一部分,而显然 x≤1。
我们设 sum=∑v∈son(u)max(gv,0),那么有 au=gu−sum。而无论 u 子树中的 a 如何取,都有 0≤sum≤∣son(u)∣。可以发现,如果 gu 在其合法区间中,那么无论 sum 是什么,唯一的使得 gu 取到当前这个值的 au(也就是 gu−sum)都在 [1−n,1] 的范围中,证明分类讨论一下 u 是否为根即可。这也就相当于:任何一组满足所有 gu 都在合法区间内的 g,都有唯一一组 a 可以得到这样的 g。
那么我们只需要考虑 g 即可。写出换根的转移式:hv=gv+max(hu−max(gv,0),0),然后分类讨论:
- 若 gv∈[−1,−hu):hv=hu+gv<0,不合法。
- 若 gv∈[−hu,0):hv=hu+gv≥0。
- 若 gv∈[0,hu):hv=hu。
- 若 gv∈[hu,1]:hv=gv。
可以发现第二种情况和第四种情况合起来恰好就是 hv 取遍 [0,1] 的情况。考虑直接写出 DP:设 fu(x) 表示 hu=x 时,u 子树中的 hu 乘积的和,那么根据上面分类讨论的结果,有转移式:
fu(x)=xv∈son(u)∏(xfv(x)+∫01fv(y)dy)
最后的答案就是 n−n∫01f1(x)dx。显然 fu(x) 是一个只和 x 有关的多项式,且其次数为 O(szu) 级别。根据树上背包的结论可以分析出直接暴力卷积和计算积分的时间复杂度就是 O(n2),可以通过。
code