KAJIMA CORPORATION CONTEST 2024(AtCoder Beginner Contest 340) G. Leaf Color(虚树+dp)

求满足颜色条件的树导出子图方案数:虚树与关键点策略
文章讨论了在一个给定颜色约束的树中,如何计算满足特定条件(每个度为1的节点颜色相同且形成一棵树)的导出子图方案数,通过构造虚树并运用动态规划方法解决,最后结果对998244353取模。

题目

n(n<=2e5)个点的树,每个点有一个颜色ai(1<=ai<=n)

求满足以下两个条件的导出子图的方案数,答案对998244353取模:

1. 是一棵树

2. 每个度为1的结点的颜色都相同

导出子图,即在n个点里选一个子集,选出一些点来,保留这些点之间原来的边,得到的图

思路来源

乱搞ac

题解

枚举每种颜色,对每种颜色求虚树,

因为,对于非叶子结点,除了lca是必经的点以外,

其他点要么顺带经过,要么不选,所以无需关注

求完虚树之后,问题转化成,对于某个给定颜色,

对于一棵树,所有叶子结点,都是关键点,

非叶子结点,有一些节点是关键点,有一些不是关键点

在虚树上取一个连通块,使得连通块的叶子都是关键点,求方案数

dp[i][2]表示以i为根,i不取/i取的方案数

1. dp[i][0]表示i不取,i不取的话所有子树都不能取

2. dp[i][1]表示i取,i取的话,子树可取可不取

特别地,当i是非关键点的时候,i不能当叶子,这一种情况需要减掉

枚举以i为根时的连通块的方案数,统计答案

1. 如果i是关键点,dp[i][1]是i为根的贡献

2. 如果i不是关键点,则i需要至少选两棵子树

因为非关键点不能当叶子,所以子树里一定有关键点

f[0/1/2]表示i的子树里选了0/1/>=2棵的方案数,背包考虑子树即可,

此时f[2]是i为根的贡献

代码

#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<vector>
#include&
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小衣同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值