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]\) 即为未匹配的最小值。
G:
题意:给你一个长为 2n 的数列,1-n 每个数出现两次,选择激活初始的数字集合S,可以将两个被激活的相同数字的区间内全部激活,求可以激活全序列的S最小元素个数和最小情况下的方案数。
Solution:
序列上跳来跳去的离散问题,没法按顺序做,看成图论题。
激活了某数字后,区间内所有数字都激活,那我们就把这个数字向区间内每个数连线,n^2 的连线可以过easy version,hard version可以考虑用线段树优化建图,如果动态开点,点数只多了2倍左右,但是边数是log倍。
如果我们激活某个点,这个点能够到达的所有点都会被激活,因此缩点后所有入度为 0 的强连通分量需要被激活,统计这些强连通分量的个数即ans1。
每个强连通分量选一个数即可,统计每个强连通分量非线段树上点的个数,乘法原理得ans2。
需要注意的是:线段树优化建图只能看做像钢管焊接时做的接口,对于那些没用到的点,我们应当将它们去除(把线段树上入度为0的点都去掉,拓扑排序去除),因为我们不能把线段树最顶上的点激活,否则每次激活那一个点就行了。