[POI 2004] SZN 题解

一道非常经典的题,这种类似线段覆盖一颗树的题目还是蛮常见的。

第一问可以 \(dp\) ,但是有更简单的方法,对于经过一个点的所有边,我们都希望它两两配对,所以最佳的情况是有$ \lfloor d_i/2\rfloor$ 对边可以配对,所以总答案就是 $n-1 - \sum \lfloor d_i/2\rfloor $ 。

第二问比较经典,容易想到二分,这里的二分最大边长为 \(len\),对于一个点有下面的线段有两种情况,可能是下面全部都自己消化掉,没有留给上面的,而另一种情况是有一条线段留给上面的。设 \(f_i\)\(i\) 这个点留给上面的链的长度,如果没有就是 0。

那对一个点更新的时候就可以把儿子的 \(f_i+1\) 这里还要加上相连的这一条边。可以储存在 multiset 里。之后需要贪心的两两配对,这里我们从小到大配对,假设现在的值为 \(val\) 找到一个小于等于 \(len-val\) 的最大值,删除即可(记得 \(val\) 这个点也要在二分查找之前删掉),若找不到,放入一个容器。最终若容器的大小大于 \(2\) 明显不行,因为不符合我们对最少的线段的定义,在根节点大于 \(1\) 也不行。而最终那个小一点的放在 \(f_i\) 里,而另一个自己消化掉。

这里时间复杂度 \(O(n\log n)\),不知道为什么 \(n\) 只开 \(10^4\)

\(val\le mid\)

posted @ 2025-07-15 19:03  hnczy  阅读(10)  评论(0)    收藏  举报