Loading

[CF 1970G2] Min-Fund Prison (Medium)

前言

发现更好的补题方法, 也是对自信的锻炼吧
现在的能力范围一般指在 \(2400\) 以下的题目, 再往上不知道应该怎么搞了, 可能理解能力不够

就是说, 不管怎么样, 题解只是参考, 用来丰富你的某个部分的理解, 还是要自己独立思考

思路

首先分析题目
真难发现, 题意可以转化为 \((\)事实上我想了 \(\rm{inf}\) 分钟, 要不是一车人秒了这个题, 不然多半就看题解了\()\)

给定一个森林, 要求把森林连成一棵树
最初森林中每个节点都有权值 \(w_i\), 现在要求在连好的树上选择一条边, 使得这条边两侧的权值相差最小

找点性质
这下真的不难发现了, 这条边可以分成两种情况

  • 这条边的两个端点分别属于两棵树
  • 这条边的两个端点属于同棵树

考虑在这个基础上处理问题
假设最初森林中有 \(n\) 棵树, 不难发现我们要连上 \(n - 1\) 条边
考虑分类讨论

这条边的两个端点属于同棵树

这种情况较为简单, 相当于我们最初有权值对 \(\{\alpha, \beta\}\) 的合法性, 然后可以把每个连通块丢给左右侧, 不难发现可以直接可行性求, 复杂度大概是 \(\mathcal{O} (mn^2)\)

这条边的两个端点分别属于两棵树

发现也不困难
我们相当于对连通块的分配问题, 因此是简单的, 复杂度 \(\mathcal{O} (n^2)\)

鲜花

摘抄一个 \(\rm{Hard}\) 的做法

进一步优化

基于以上分析, 不难写出一个 dp\rm{dp}

fi,jf_{i, j} 表示考虑到第 ii 个连通块, 最终答案中某一个连通块的大小是 jj 是否可行; 同时令 gi,jg_{i, j} 表示在不断边的情况下, 前面的连通块是否可以构成一个大小为 jj 的连通块

枚举到一个连通块时, 先求出这个连通块所有边双, 缩掉边双成树后, 统计树上每个点子树的大小
此时树上的每条边都是桥, 如果当前选择断掉树上的边, 设断掉后树两侧的节点树分别为 v1,v2v_1, v_2, 则有转移
fi,jgi1,jv1,fi,jgi1,jv2f_{i, j} \gets g_{i - 1, j - v_1}, f_{i, j} \gets g_{i - 1, j - v_2}
gi,jg_{i, j} 则有转移
gi,jgi1,jSg_{i, j}\gets g_{i - 1, j - S}, 其中 SS 为连通块大小

最后在 f(c,)=1f(c, \boxed{})=1 处贡献答案即可, cc 为连通块个数
直接 dp 即可做到 O(n2)\mathcal{O}(n^2)。注意到 ffgg 均为 0101, 且转移形式简单, 故可以 bitset\rm{bitset} 优化, 做到 O(n2ω)\mathcal{O}\left(\dfrac{n^2}{\omega}\right)

总结

很好的补题方法, 大力推广

一种新颖的 \(\rm{dp}\) 优化
也就是特殊问题利用一般性问题优化

posted @ 2025-03-27 10:23  Yorg  阅读(17)  评论(0)    收藏  举报