[LOJ 2462][2018 集训队互测 Day 1]完美的集合

完美的集合

题解

生平最讨厌的卡常。

其实这道题蛮好想的。

由题可知,如果一个集合能用,它一定是一个联通块而且总重量小于m。很明显的dp了,数据范围也不大。

我们可以先以每个节点为根,都做一次dp。

不过我们马上发现,时间复杂度是O\left(n^{2}m^{2} \right ),明显要超时。那我们应该怎么做呢?

我们可以采取dfs序dp。因为我们只需求出每个根的dp值,那么其它点的dp值我们都是可以不管的,也就是它是什么值都无所谓。那么我们就将每个点的子树大小记录下来,对于一个点,如果它的dfs序为i,那么ii+ siz_{i}- 1属于它的子树。而它的dfs序减去它父亲下一个儿子的子树大小就是他父亲下一个儿子的dfs序。如此我们就可以将上一个儿子的dp值与下一个儿子的dp值放在一起,一直更新到它的祖先。

我们这样就可以在

posted @ 2022-07-13 09:43  StaroForgin  阅读(3)  评论(0)    收藏  举报  来源