这题和luogu模板几乎一模一样
暴力就是将每次dp一遍,将特殊点特判
f [ i ] [ 0 ] = ∑ f [ s ] [ 1 ] f[i][0]=\sum f[s][1] f[i][0]=∑f[s][1]
f [ i ] [ 1 ] = ∑ min ( f [ s ] [ 0 ] , f [ s ] [ 1 ] ) f[i][1] = \sum \min(f[s][0],f[s][1]) f[i][1]=∑min(f[s][0],f[s][1])
如果一个点必选,可以将它的值改成 − ∞ -\infty −∞,必不选可以改成 ∞ \infty ∞
然后考虑动态dp
g0表示除了重儿子这个点不选的最小代价,g1表示选这个点的最小代价
然后重链上的信息可以用线段树维护,构造一个矩阵
[
∞
,
g
i
,
0
g
i
,
1
,
g
i
,
1
]
∗
[
f
s
,
0
f
s
,
1
]
=
[
f
i
,
0
f
i
,
1
]
\begin{bmatrix} \infty, g_{i,0}\\ g_{i,1}, g_{i,1}\\ \end{bmatrix} * \begin{bmatrix} f_{s,0}\\ f_{s,1} \end{bmatrix} = \begin{bmatrix} f_{i,0}\\ f_{i,1} \end{bmatrix}
[∞,gi,0gi,1,gi,1]∗[fs,0fs,1]=[fi,0fi,1]
这个矩阵的运算为
c
i
,
j
=
min
(
a
i
,
k
+
b
k
,
j
)
c_{i,j} = \min (a_{i,k} + b_{k,j})
ci,j=min(ai,k+bk,j)
修改就是修改这个点到根路径上的每条重链
查询以一个点子树的最大值就是需要查询整条重链
复杂度 O ( 8 n l o g 2 n ) O(8nlog^2n) O(8nlog2n)
这题有更优秀的做法,可以去了解一下