【杂题,树】【Uoj】Uoj618 【JOISC2021】聚会 2

发布时间 2023-07-07 10:23:35作者: CharlieVinnie

2023.7.3 Problem Link

给定一棵 \(n\) 个点的树,对于一个点集 \(S\),定义 \(f(u,S)\)\(\min_u \sum_{v\in S} \mathrm{dis}(u,v)\)\(g(S)\) 为使得 \(f(u,S)\) 取到最小值的 \(u\) 个数。对 \(1\le i\le n\),求 \(\min_{|S|=i} g(S)\)


首先当 \(i\) 是奇数的时候答案一定为 \(1\),否则答案一定是一条链。把思路转移到这条链上。

考虑这条链上的点有什么性质,就是这条链的端点满足它指向链外的子树大小 \(\ge i/2\),然后动态加新满足条件的点维护整棵树的直径即可。

但是发现我们并不知道一个点往外指的子树是哪条,怎么办呢?

思路 1:发现点不好考虑,转到边上。发现一条边在链上需要它两边的子树中较小的那个 \(\ge i/2\) 即可,于是把加点变成加边即可。

思路 2:考虑点还是可以的。发现对于链的端点,链那端的子树大小一定 \(\ge i/2\),所以把一个点的权值定为除去最大子树以外的子树和即可。