好早之前看到的一个题。
‘
首先考虑最优情况下 $y$ 条链会形成经过 $2y$ 个叶子。
先不考虑 $x$ 的限制。有一个很显然的贪心,直接对原树进行带权值的长链剖分,我们直接贪心地选前 $2y-1$ 条长链即可。但是这样我们需要对每个点都作为根求一次。但是注意到直径是必选的,于是我们对于直径的两端分别做一次即可。
考虑需要包含 $x$ 的限制,还是考虑上面的做法,尝试进行调整,容易发现是只可能是如下的两种情况:
- 将排名第 $2y-1$ 的链去掉,改为连向 $x$ 的链。
- 将离 $x$ 最近的一条链的连向 $x$ 的链。
注意到这是带权值的长链剖分,不能直接暴力跳,因为这样会被卡到单次 $\mathcal O(n)$,这一部分我们倍增跳即可。时间复杂度为 $\mathcal O(n\log n)$。代码很好实现。