Atcoder abc340
https://atcoder.jp/contests/abc340
G - Leaf Color
n点树,点有颜色,问又多少个 导出子图的“端点”都是同色 mod 998244353
n 2e5
2s
1024mb
我的思路
每个颜色单独考虑
那实际上是选择同色的点,要让任何三点不共线,没想到怎么统计
题解
我一直没想通的地方
1 | 1 |
是 如何不重不漏
例如这里 的y 是可以在选择下面两个1的时候,作为lca的
而x 是不能的
而根部的1是可以的
利用树型 令 f[u]
为选择u
以及u
向下的多个 末端是1的方案数
这里对 u的要求没有
那么 $f[u] = \prod (f[v]+1)$
其中$v$是$u$的子节点,而 $+1$ 表示 $v$及其子树不选的情况,
而如果 全部都不选 则对应到 所有的$+1$相乘,这种情况只有 $u$是可单独选时才可行,所以u不能单独选的时候需要 $-1$
$f[u]=(\prod (f[v]+1))- [u!=1]$
考虑贡献
1 | 1 |
这里u和v 以及它们之间的f 都是3
然而只有u 是可以选的
也就是 一个0节点的 单个分支 的所有选法不构成贡献
$ans += f[u]-\sum f[v]$ 其中 $u$是不可单独选,$v$是$u$的子节点
$ans += f[u]$ 其中 $u$可单独选
剩下的就是每个颜色单独提出来了,因为对于颜色c,显然 每个非c颜色的点要保留,那么它是 某些颜色c的lca,而每多一个lca,至少需要多一个颜色c节点,所以拆出来的树的节点总和,不多于2n个节点
代码
https://atcoder.jp/contests/abc340/submissions/52926899
1 |
|
总结
g:
树上dp没想到真不应该,不过虚树抽出来还是第一次学
虚树 的建立法说白了是
- 计算点的dfs顺序
dfn[u]
- 把同色点按照 先序dfn排序
- 把按照dfn序的相邻点的 lca加入就好!!
- sort+去重 同样按照 dfn序
- 建立新树,那么
点[i-1]
和点i
,有两种关系点[i-1]
是点[i]
的父节点点[i]
的父节点是点[i-1]
的祖先节点
1 | 1 |
第一次见用轻重链来做 lca的!!怎么感觉比 倍增的智力负担还小!
1 | int lca(int u,int v) { |