SelectEdges

[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)\)

AC

posted @ 2023-07-02 15:58  wscqwq  阅读(22)  评论(0编辑  收藏  举报