[ABC259F] Select Edges
树形 DP
+贪心。
拟定 \(1\) 为根。
首先考虑状态 \(f[i][0/1]\) 表示以 \(i\) 为根的子树内的答案,它的父节点到它的边没选/选,注意这里状态中没有考虑父节点到它的边的边权。
然后可以先将所有 \(i\) 的子节点 \(v\) 累加,即 \(f[i][0]=\sum f[v][0]\)。如果 \(d[i]=0\),令 \(f[i][1]=-inf\)。
接下来就是剩余的边怎么选择了。我们可以记选择边 \(w\) 的贡献为 \(w+f[v][1]-f[v][0]\)(因为你上面已经累加了 \(f[v][0]\))。然后发现是可以贪心的,直接累加最大的几个数即可,如果是 \(f[v][1]\),那么就减少一个。这里可以用快速选择算法使得复杂度降到 \(O(n)\)。
自己写的快速选择算法似乎和 STL
差不多。。。那以后尽量用 STL
,而且听说 STL
不会被卡成 \(O(n^2)\)。