CF1914 F,G 题解

虽然说是div3,但是最后两道题还挺有意思。

F:

题意:给出一棵树,若两点非祖孙关系则可两两配对,求最大匹配数。

Solution:

发现各种贪心都有反例,不太会,考虑树形 dp。(最近树形背包做多了老是觉得凡是树形dp都是n方起步)

\(f[u]\) 表示 u 这棵子树内还有多少没配对。在 dp 的过程中将儿子的子树一点点并入父亲 u 中。

我们发现当子树的 \(f[u]\) 确定时,子树内所有没匹配的点都可以向外任意匹配,已经匹配了的点也可以拆开视作未匹配,因此局部最优值不影响全局最优,我们让 \(f[u]\) 每次都更新至最小值。

因此树形 dp 的过程就是合并两棵子树,先让双方未匹配的部分匹配 \(min(f[u],f[v])\) 对,剩下的那部分就将原先匹配过的拆掉去补上,注意拆的都是一对对的,奇偶需要分开讨论。

答案输出 \(f[1]\) 即为未匹配的最小值。

my submission

G:

题意:给你一个长为 2n 的数列,1-n 每个数出现两次,选择激活初始的数字集合S,可以将两个被激活的相同数字的区间内全部激活,求可以激活全序列的S最小元素个数和最小情况下的方案数。

Solution:

序列上跳来跳去的离散问题,没法按顺序做,看成图论题。

激活了某数字后,区间内所有数字都激活,那我们就把这个数字向区间内每个数连线,n^2 的连线可以过easy version,hard version可以考虑用线段树优化建图,如果动态开点,点数只多了2倍左右,但是边数是log倍。

如果我们激活某个点,这个点能够到达的所有点都会被激活,因此缩点后所有入度为 0 的强连通分量需要被激活,统计这些强连通分量的个数即ans1。

每个强连通分量选一个数即可,统计每个强连通分量非线段树上点的个数,乘法原理得ans2。

需要注意的是:线段树优化建图只能看做像钢管焊接时做的接口,对于那些没用到的点,我们应当将它们去除(把线段树上入度为0的点都去掉,拓扑排序去除),因为我们不能把线段树最顶上的点激活,否则每次激活那一个点就行了。

my submission

posted @ 2024-02-05 19:25  maple276  阅读(9)  评论(0编辑  收藏  举报