它们中的多少个

这道题目真实绝了,这篇随笔主要是对蓝书上面的注释

首先那个结论肯定要知道,然后选取1号点作为基准点也是想到了的

那么接下来肯定就是把1号点所在连通块当做树根嘛,问题是怎么去分配剩下的点

我最开始想的是像树形背包一样去DP,但是不知道具体有多少子树,然后我又想枚举子树个,但是显然会爆炸

那么这个时候蓝书的操作就惊天地泣鬼神了,直接把这个状态G给设置了出来,所以要敢于设置状态

那么F就可以推走了

对于F[i,0],蓝书采用了补集做法,这也告诉我们,对一个数组,可能一部分用正面求另一部分用反面求

然后对于G为啥要乘以p蓝书上面也解释了。他这个“有根”指的就是从每个连通块选出一个代表点作为这个连通块的根

主要是之前在计算F的时候,为啥只用乘以kx,即使因为这里算的G是“有根”的

其实正如蓝书上面所说,这里算“有根”G是必要的,因为最开始计算F的时候我们还需要知道每个连通块具体有多少个点,这当然是不可能完成的,然而从这道题目可以看出,如果以后我们需要这么干,我们就在计算G的时候算成有根的就行了

这道题目的代码还没写,写一下

update 2024.9.13

我们说计数DP两个办法,一个是容斥原理,一个是设出状态递推。这道题目同时涉及两个算法,而且还涉及了方法的嵌套(这里设出G就是方法的嵌套)。所以做的过程当中,遇到什么不好直接表示的可以尝试预处理

注意这道题目只能讨论1所在的联通分量,不能讨论包含1的且包含割边的连通块(也就是在枚举断掉连向1所在的联通分量的一条边),这样子会重复计数

posted @   最爱丁珰  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示