LOJ2462 完美的集合(2018集训队互测)

题意:

给定一棵树,每个点有重量 wi 和价值 vi,每条边有长度 ci
定义一个完美的点集 SS 连通、S 总重 MS 的价值最大。(即在所有连通且总重 M 的集合中,S 的价值最大)

定义一个结点 x 能测试结点 y,当且仅当 dist(x,y)Maxvy。定义一个结点 x 能测试一个点集 S,当且仅当 xSx 能测试 S 中所有结点。

小 A 要从所有完美的集合中选 K 个构成方案。定义一个方案合法:存在一个结点 x 能测试所有被选的集合。

问有多少个合法方案。对 523 取模。

n60,M104,ci,wi,vi,K109,Max1018


一个显然的结论是能 test 一个结点的结点是一个连通块(一棵树)。但是这有什么用?

树上,点个数 - 边个数 = 1.

定义 ANS1=x能被 x test 的 k 个集合选法总数ANS2=(u,v)T能被 u,v 同时 test 的 k 个集合选法总数。则 ANS1ANS2 即为答案。

为什么?考虑对于一组固定的 S1Sk,能 test 它们的 x 是一个连通块。对于这样一组集合选法,我们只希望计数 1,所以刚好点数 - 边数 = 1。交换一下求和顺序和 ANS1ANS2 等价了。

转化为两个问题:

  1. 固定 x,使得 x test 的集合选法有几种。

  2. 固定 u,v,使得 u,v 都 test 的集合选法有几种。

因为 x 固定了,所以每个结点能不能选也确定了,这就是为什么上面要搞那一堆东西。

第二种是类似的,只考虑第一种。

为了判定集合是否完美,首先需要知道所有总重 M 的集合最大权值是多少。这可以用 dfs 序 DP 做:枚举一个根,然后 O(nm) 做。复杂度 O(n2m)

然后我们再来一次 dfs 序 DP 求有几种选法。dp[i][j] 表示当前 dfn = i,总重 j 的最大价值。cnt[i][j] 表示取到 dp[i][j] 的选法总数。看 dp[n+1][?] 是否是上面求出的最大价值,决定 cnt[n+1][?] 是否贡献。

看似已经大功告成,但还有一个问题:怎么对 523 取模???

可以使用 exLucas 定理,戳这里

posted @   FLY_lai  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示