洛谷P4383 [八省联考2018]林克卡特树

传送门

想一下,把一条边弄成(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))级别

原文地址:https://www.cnblogs.com/knife-rose/p/12617052.html