题目简述:给定$n \leq 3 \times 10^5$个节点的树,其中一部分节点被染色,一共有$k$种不同的颜色。求将树划分成 $k$ 个不相交的部分的方案数,使得每个部分中除了未染色的节点以外的所有节点颜色相同,答案模$998244353$(质数)。

解:code

Step 1. 缩点

相关题目:CodeForces 76F. Tourist

观察:为使相同颜色的节点处在同一个子树中,则包含这些节点的最小子树的所有节点必然会被划分在同一部分。

因此,在随意选择一个节点作为树的根节点后,每种颜色的所有节点的LCA(最近公共祖先)必然也与这些节点在同一部分。

同时,我们也得到了无解判定:如果某两种颜色的节点的最小子树具有相同部分,则必定无解。

在判断有解之后,我们可以把每种颜色对应的最小子树缩成一个节点,则问题就转化为:

【一个$n \leq 3\times 10^5$个节点的树,其中有$k$个节点是被标记的,问有多少种方法把树分成$k$部分,每部分包含恰好一个被标记的节点。】

Step 2. 动态规划

我们在缩点之后,只需要解决转化后的问题。

设$f[x][s]$表示以$x$为根的子树有多少种划分方式,使得$x$所在的部分 【未包含$s=0$ / 包含$s=1$】 一个被标记的节点。于是答案为$f[r][1]$,其中$r$是根节点。

1. 若$x$未被标记,则

1.1. 若$x$所在部分未包含被标记的节点,则对每个$x$的儿子节点$y$,若$y$所在部分包含了被标记的节点,则必然不与$x$在同一部分;若$y$所在部分未包含被标记节点,则必然与$x$在同一部分,因此有$f[y][0]+f[y][1]$种可能。由乘法原理,有

$$ f[x][0] = \prod_{y \in \text{son}(x)} (f[y][0]+f[y][1]). $$

1.2. 若$x$所在部分包含被标记的节点,则枚举$x$的儿子节点$y$,其所在部分包含被标记节点,有$f[y][1]$种可能;对其他儿子节点$z \neq y$,若$z$所在部分包含了被标记的节点,则必然不与$x$在同一部分;若$z$所在部分未包含被标记节点,则必然与$x$在同一部分,因此有$f[z][0]+f[z][1]$种可能。由乘法原理和加法原理,有

$$ f[x][1] = \sum_{y \in \text{son}(x)} f[y][1] \prod_{y \neq z \in \text{son}(x)} (f[z][0]+f[z][1]). $$

2. 若$x$被标记,则

2.1. $x$所在部分不可能未包含被标记节点,即

$$ f[x][0] = 0, $$

2.2. 若$x$所在部分包含被标记的节点,则对每个$x$的儿子节点$y$,若$y$所在部分包含了被标记的节点,则必然不与$x$在同一部分;若$y$所在部分未包含被标记节点,则必然与$x$在同一部分,因此有$f[y][0]+f[y][1]$种可能。(这与1.1.的讨论相同)由乘法原理,有

$$ f[x][1] = \prod_{y \in \text{son}(x)} (f[y][0]+f[y][1]). $$

总时间复杂度为$O(n)$。

CodeForces 1118F2. Tree Cutting (Hard Version)的更多相关文章

  1. Codeforces 1118F1 Tree Cutting (Easy Version) (简单树形DP)

    <题目链接> 题目大意: 给定一棵树,树上的点有0,1,2三中情况,0代表该点无色.现在需要你将这棵树割掉一些边,使得割掉每条边分割成的两部分均最多只含有一种颜色的点,即分割后的两部分不能 ...

  2. Codeforces Round #540 (Div. 3) F1. Tree Cutting (Easy Version) 【DFS】

    任意门:http://codeforces.com/contest/1118/problem/F1 F1. Tree Cutting (Easy Version) time limit per tes ...

  3. Tree Cutting (Hard Version) CodeForces - 1118F2 (树形DP,计数)

    大意:给定树, 每个点有颜色, 一个合法的边集要满足删除这些边后, 每个连通块内颜色仅有一种, 求所有合法边集的个数 $f[x][0/1]$表示子树$x$中是否还有与$x$连通的颜色 对于每种颜色已经 ...

  4. Codeforces Round #540 (Div. 3)--1118F1 - Tree Cutting (Easy Version)

    https://codeforces.com/contest/1118/problem/F1 #include<bits/stdc++.h> using namespace std; in ...

  5. Codeforces 1118 F2. Tree Cutting (Hard Version) 优先队列+树形dp

    题目要求将树分为k个部分,并且每种颜色恰好在同一个部分内,问有多少种方案. 第一步显然我们需要知道哪些点一定是要在一个部分内的,也就是说要求每一个最小的将所有颜色i的点连通的子树. 这一步我们可以将所 ...

  6. 解题:CF1118F2 Tree Cutting (Hard Version)

    题面 好题不问Div(这是Div3最后一题,不得不说Mike真是强=.=) 首先同一个颜色的点的LCA要和它们在一个划分出的块里,那么我们先按颜色把所有点到它们的LCA的路径涂色,如果这个过程中出现了 ...

  7. 【HDU 5909】 Tree Cutting (树形依赖型DP+点分治)

    Tree Cutting Problem Description Byteasar has a tree T with n vertices conveniently labeled with 1,2 ...

  8. BZOJ3391: [Usaco2004 Dec]Tree Cutting网络破坏

    3391: [Usaco2004 Dec]Tree Cutting网络破坏 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 47  Solved: 37[ ...

  9. BZOJ 3391: [Usaco2004 Dec]Tree Cutting网络破坏( dfs )

    因为是棵树 , 所以直接 dfs 就好了... ---------------------------------------------------------------------------- ...

随机推荐

  1. Oracle 10g ORA-12154: TNS: could not resolve the connect identifier specified 问题解决! 我同事遇到的问题。 username/

    Oracle 10g ORA-12154: TNS: could not resolve the connect identifier specified 问题解决! 我同事遇到的问题. userna ...

  2. 微信小程序页面布局之弹性布局-Flex介绍

    布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性.它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现. 2009年,W3C 提出了一种新 ...

  3. BeeFramework 系列二 UISignal篇下

    本文转载至 http://www.apkbus.com/android-126129-1-1.html     qihoo2 该用户从未签到 156 主题 156 帖子 1826 积分 Android ...

  4. 我的Android进阶之旅------>Android如何去除GridView的按下或点击选中后的背景效果

    今天用GridView做了一个界面,自己自定好了一个组件,并且设置好了点击和不点击组件时候的效果,但是运行的时候发现在我定义好的背景下面还有一层不知道哪儿来的背景,严重影响了我自定义的组件的效果. 后 ...

  5. SQL2005数据库放在C盘,结果C盘满了,怎么搞到D盘

    首先,你需要将自己所建立的数据库从SQL2005中分离出来,然后按照自己的存储路径找到自己所建数据库存储的位置,把它剪切到D盘就可以了.(mdf,ldf都应该考过去,自己建立路径存储就可以,再次打开的 ...

  6. (转)三层和mvc

    先说下两者出现的目的:三层是一种为了Project间解除耦合所提出来的简单的分层方式但MVC其实并不是基于Project的分层方式,而是一种解除展示模板与主要访问控制依赖的设计模式(其实全部都是基于U ...

  7. testng testcase失败重试

    简单介绍 需求场景:测试移动端应用,常会因为点击失效.网络延迟大等原因导致测试脚本失败.这时,需要自动重新运行失败的脚本,直到脚本成功通过或者到达限定重试次数. 解决方案:实现testng的IRetr ...

  8. Redis shell

    Redis shell 命令 参数 功能 redis-cli -r 将一个命令执行多次 -i 每隔几秒执行一次 -x 和|一起接收前面地输出,并执行命令 -c   -a   --scan/--patt ...

  9. UVA - 10305 【全排列】

    题意 要求给出一组 包含 1 - N 的数字的序列 要求这个序列 满足 题给的限制条件 比如 1 2 就是 1 一定要在 2 前面 思路 因为 数据规模较小 可以用 全排列 然后判断每个序列 是否满足 ...

  10. Android Weekly Notes Issue #276

    September 24th, 2017 Android Weekly Issue #276 本期内容包括LifeCycle与Architecture的相关文章,以及新的JSON解析库Moshi的介绍 ...