加载中...

10.17 —— (VP) 2021icpc沈阳

自己 \(vp\) 区域赛以来最好的一把,赛时 \(5\) 题,罚时 \(607\),正式赛大概 \(rk 120\) 左右,属于是蒟蒻的超水平发挥了。尤其是 \(H\) 题最后半小时内想出正解并且 \(1A\),感觉真的特别爽。

\(E, F\) 纯签到。

\(B\) 题套路也极为典型,二进制拆位考虑就可以把看似很难的问题划分成 $O(\log) $ 个很简单的子问题,需要用到并查集和二分图染色,这里不再赘述详细解法。

code

\(J\) 题吃了 \(6\) 发罚时,属实是有些唐了。记住,罚时很重要!罚时很重要!罚时很重要!此题的套路也很典型:\(a, b\) 做相同的操作,答案不会改变。因此对于所有询问,直接将这些询问的 \(a\) 归一化,于是问题就变成了单源最短路问题,一次 \(bfs\) 即可,复杂度 \(O(20 * 10000)\),其中 \(20\) 是状态转移过程中的常数,\(10000\) 是状态总数。

code

\(H\) 题需要将题意化繁为简的能力,把问题变成一个易懂的形式,剩下的就特别好想了。与本题等价的问题是:每次可以选取具有公共结点的一对边,每条边只能选一次,直到不能再继续选,最大化选取所有边的总和。 由于给定图是连通的,不难猜到,当边数为偶数时,所有的边一定都可以选到;而边数是奇数时,一定可以选 \(m - 1\) 条边,也就是只有一条边不会被选择。那么我们就可以枚举所有边,看不选它时,剩下的所有边能否均被选择。此时有两种情况:

  • 该边不是割边:那么去掉这条边后,剩下的图仍然连通,且边数为偶数,情况与上一个相同,一定可以都选到。
  • 该边是割边:去掉该边后,会形成两个连通块,并且这两个连通块的奇偶性相同。显然如果是偶数,则可行;奇数则不可行。

于是问题缩小为了:去除连通图的一条指定割边,判断形成的两个连通块的奇偶性。可以用 \(dcc\) 边双连通分量对原图进行缩点,形成由割边构成的一棵树。则连通块内的边数就等于内部的割边数+非割边数。割边数就是子树大小-1,非割边数就是子树内所有边双内的边数之和,可以一次 \(dfs\) 预处理得到所有割边的解。

code

接下来是补题时间。

L. Perfect Matchings

原问题等价于:求给定的一棵大小为 \(2n\) 的树中,不含有树边且匹配数为 \(n\)(选 \(n\) 个点对,即所有点均要匹配到)的最大匹配数量。

容斥原理 + 树上背包

反向思考,考虑求至少包含一条树边的匹配方案数。

\(S_{i}\):一定包含第 \(i\) 条树边的匹配方案数

那么显然 \(ans = \cup_{i=1}^{2n-1} S_{i}\)

求并集大小的经典算法就是容斥原理:
pV1g3As.png

\(S_{i} \cap S_{j}\) 就相当于一定包含第 \(i, j\) 条树边。对于所有可能的 \(1 \leq i < j \leq 2n-1\)\(\sum_{i<j}|S_{i} \cap S_{j}|\) 等价于在匹配包含任意两条树边的合法情况下,剩下未匹配的结点可自由匹配,方案数。

\(f_{i}\):选取整棵树中的 \(i\) 条两两之间无公共端点的树边,方案数;\(g_{i}\)\(i\) 个结点两两自由匹配,方案数(这里 \(i\) 一定是偶数)
则:

\[ans = \sum_{i=1}^{n} (-1)^{i-1}f_{i}*g_{2n-2i} \]

\(g_{i}\) 直接推式子就能求,很简单。

现在求 \(f_{i}\):考虑树形 \(dp\)

状态定义:\(dp_{u,j,0/1}\):考虑子树 \(u\),选取恰好 \(j\) 条两两之间无公共端点的树边,且根节点 \(u\) 未匹配 \(or\) 匹配,方案数。

状态转移:等价于树上背包。将边数作为背包体积,每次考虑合并子树 \(v\) 到当前正在扩展的子树 \(u\) 即可,最终 \(f_{i} = dp_{1,i,0} + dp_{1,i,1}\)。具体细节见代码,复杂度 \(O(n^{2})\)

code

\(M\) 题是后缀自动机,蒟蒻还没学,等有时间再补~

posted @ 2025-10-17 22:24  jxs123  阅读(17)  评论(0)    收藏  举报