想一下,把一条边弄成\(0\),然后连起来
那这条边有毛价值,神经病
所以题意是树上选\(m+1\)条链,权值和最大
我们令每个点的点权为父边的边权
考虑一个我想不到的暴力\(dp\)
\(f[u][j][0/1/2]\)表示以\(u\)为根的子树,已经选了\(j\)条链,当前节点被选择与\(0/1/2\)个节点相连的最大价值
当\(u\)与\(0\)个节点相连时,直接从子树中选\(m\)条链
\(f[u][j][0]=max\{f[v][k][0]+f[u][j-k][0]\}\)
当\(u\)与\(1\)个节点相连时,讨论从已经处理的子树中选还是从新子树中选
\(f[u][j][1]=max\{f[u][k][0]+f[v][j-k][1]+a[i].val,f[u][k][1]+f[v][j-k][0]\}\)
当\(u\)与\(2\)个节点相连时,说明这条链的端点分别在两个子树内,我们讨论自己和儿子拼起来和原本子树中已经有了的情况
\(f[u][j][2]=max\{f[u][k][1]+f[v][j-k-1][1]+a[i].val,f[u][k][2]+f[v][j-k][0]\}\)
中间\(j-k-1\)是因为我们不把\(1\)算作已经选出的链,但是\(0/2\)都算作已经选择完毕的链
由于\(1\)不算作已经选出,所以可以从\(0\)和\(m\)转移,需要注意
然后为了向上传递方便,我们需要合并答案
\(f[u][j][0]=max\{f[u][j][0],f[u][j-1][1],f[u][j][2]\}\)
暴力\(dp\)就做完了,如果加上下界优化应该是\(O(nk)\),但是我也不会证明
考虑选择的数量这个问题,感性的理解它应该是一个上凸函数,一开始会选价值最高的链,后面的链价值越来越低,斜率越来越小
那么可以考虑\(WQS\)二分,优化掉数量维,每选出一条链减去一定代价
最后算出最大价值选择的链数
成功优化到\(O(nlogn)\)级别