CodeForces - 1118 F2 Tree Cutting
题解:
先注意到一定存在k种颜色,切成k个块, 然后要求每个块内的颜色都一样,所以可以发现同一种颜色一定在同一个块内,故任意2个相同颜色的最短路劲上的点的颜色都是该颜色。
我们可以先把任意相同颜色点对的路径上的点的颜色都染成这个颜色。 如果发现存在一个点是已经有颜色的话,那么答案一定为0。
至于怎么颜色, 我们可以暴力往上跑,然后压缩路径,和并查集一样的道理,路过的点都染色且压缩。
这样就完成了第一部分的处理,接下来就是树DP了。
定义dp[ u ][ 0 ] 的含义是 以u为根的子树,且u还未被划入任意一种颜色的方案数。
dp[ u ][ 1 ] 的含义是 以u为根的子树,且u已被划入任意一种颜色的方案数。
那么对于有颜色的点来说,
dp[u][0] = 0;

对于没有颜色的点来说:


代码:
/*
code by: zstu wxk
time: 2019/03/02
Tags: 树DP
Problem Link: http://codeforces.com/contest/1118/problem/F2
Solve: https://www.cnblogs.com/MingSD/p/10462228.html
*/
#include<bits/stdc++.h>
using namespace std;
#define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
#define LL long long
#define ULL unsigned LL
#define fi first
#define se second
#define pb push_back
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define lch(x) tr[x].son[0]
#define rch(x) tr[x].son[1]
#define max3(a,b,c) max(a,max(b,c))
#define min3(a,b,c) min(a,min(b,c))
typedef pair<int,int> pll;
const int inf = 0x3f3f3f3f;
const int _inf = 0xc0c0c0c0;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const LL _INF = 0xc0c0c0c0c0c0c0c0;
const LL mod = ;
const int N = 3e5 + ;
int n, k, deep[N], fa[N], col[N];
vector<int> vc[N], e1[N];
void dfs(int o, int u){
deep[u] = deep[o] + ;
fa[u] = o;
for(int v : e1[u]){
if(v == o) continue;
dfs(u, v);
}
}
bool Link(int u, int v, int k){
int tu = u, tv = v;
while(u != v){
if(deep[u] > deep[v]){
u = fa[u];
if(col[u] && col[u] != k) return false;
col[u] = k;
}
else {
v = fa[v];
if(col[v] && col[v] != k) return false;
col[v] = k;
}
}
while(tu != u){
int tt = fa[tu];
fa[tu] = u;
tu = tt;
}
while(tv != v){
int tt = fa[tv];
fa[tv] = v;
tv = tt;
}
return true;
}
LL dp[N][];
LL t1[N], t2[N], t3[N];
void DFS(int o, int u){
for(int v : e1[u]){
if(v == o) continue;
DFS(u, v);
}
if(col[u]) {
dp[u][] = ;
dp[u][] = ;
for(int v : e1[u]){
if(v == o) continue;
dp[u][] = (dp[u][] * (dp[v][] + dp[v][])) % mod;
}
}
else {
dp[u][] = ;
dp[u][] = ;
int k = e1[u].size();
if(k){
for(int i = ; i < k; ++i){
if(e1[u][i] == o)
t1[i+] = ;
else {
t1[i+] = dp[e1[u][i]][] + dp[e1[u][i]][];
dp[u][] = dp[u][] * t1[i+] % mod;
}
}
t2[] = t3[k+] = ;
for(int i = ; i <= k; ++i)
t2[i] = t1[i] * t2[i-] % mod;
for(int i = k; i >= ; --i)
t3[i] = t1[i] * t3[i+] % mod;
for(int i = ; i < k; ++i){
int v = e1[u][i];
if(v == o) continue;
dp[u][] = (dp[u][] + dp[v][] * t2[i] % mod * t3[i+] % mod) % mod;
}
}
}
}
void Ac(){
for(int i = , v; i <= n; ++i){
scanf("%d", &v);
if(v) vc[v].pb(i);
col[i] = v;
}
for(int i = , u, v; i < n; ++i){
scanf("%d%d", &u, &v);
e1[u].pb(v);
e1[v].pb(u);
}
dfs(, );
for(int i = ; i <= n; ++i){
for(int j = ; j < vc[i].size(); ++j){
if(!Link(vc[i][],vc[i][j],i)) {
puts("");
return ;
}
}
}
DFS(, );
printf("%I64d\n", dp[][]);
}
int main(){
while(~scanf("%d%d", &n, &k)){
Ac();
}
return ;
}
CodeForces - 1118 F2 Tree Cutting的更多相关文章
- Codeforces 1118 F2. Tree Cutting (Hard Version) 优先队列+树形dp
题目要求将树分为k个部分,并且每种颜色恰好在同一个部分内,问有多少种方案. 第一步显然我们需要知道哪些点一定是要在一个部分内的,也就是说要求每一个最小的将所有颜色i的点连通的子树. 这一步我们可以将所 ...
- 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 ...
- 贪心 Codeforces Round #300 A Cutting Banner
题目传送门 /* 贪心水题:首先,最少的个数为n最大的一位数字mx,因为需要用1累加得到mx, 接下来mx次循环,若是0,输出0:若是1,输出1,s[j]--: 注意:之前的0的要忽略 */ #inc ...
- 水题 Codeforces Round #300 A Cutting Banner
题目传送门 /* 水题:一开始看错题意,以为是任意切割,DFS来做:结果只是在中间切出一段来 判断是否余下的是 "CODEFORCES" :) */ #include <cs ...
- 【HDU 5909】 Tree Cutting (树形依赖型DP+点分治)
Tree Cutting Problem Description Byteasar has a tree T with n vertices conveniently labeled with 1,2 ...
- BZOJ3391: [Usaco2004 Dec]Tree Cutting网络破坏
3391: [Usaco2004 Dec]Tree Cutting网络破坏 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 47 Solved: 37[ ...
- BZOJ 3391: [Usaco2004 Dec]Tree Cutting网络破坏( dfs )
因为是棵树 , 所以直接 dfs 就好了... ---------------------------------------------------------------------------- ...
- Tree Cutting
Tree Cutting Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/131072 K (Java/Others) Prob ...
- Problem - D - Codeforces Fix a Tree
Problem - D - Codeforces Fix a Tree 看完第一名的代码,顿然醒悟... 我可以把所有单独的点全部当成线,那么只有线和环. 如果全是线的话,直接线的条数-1,便是操作 ...
随机推荐
- 一道看似简单的go程序的深入分析
先上代码: func main() { var a [10]int for i := 0; i < 10; i++ { go func(i int) { for { a[i]++ } }(i) ...
- MyBatis 核心配置综述之StatementHandler
目录 MyBatis 核心配置综述之StatementHandler MyBatis 四大组件之StatementHandler StatementHandler 的基本构成 StatementHan ...
- Maven从入门到放弃
1.maven是什么? maven是Apache下的一个纯java开发的一个开源项目,它是一款能够抽象构建过程,并且提供依赖管理,中央仓库,自动下载构建等功能的项目构建工具. 2.为什么要使用mave ...
- 记录一下我做Udacity 的Data Scientist Nano Degree Project
做项目的时候看了别人的blog,决定自己也随手记录下在做项目中遇到的好的小知识点. 最近在做Udacity的Data Scientist Nano Degree Project的Customer_Se ...
- 基于Spring注解的上下文初始化过程源码解析(二)
上一篇看完了register方法的代码,继续跟后面代码 后面执行refresh方法,代码清单如下: public void refresh() throws BeansException, Illeg ...
- Docker启用TLS进行安全配置
之前开启了docker的2375 Remote API,接到公司安全部门的要求,需要启用授权,翻了下官方文档 Protect the Docker daemon socket 启用TLS 在docke ...
- Scala函数式编程(三)
Scala既是一门面向对象(OOP)语言,又是一门函数式编程(FP)语言.作为一门支持函数式编程的语言,Scala鼓励面向表达式编程(EOP)模型.简单来说,EOP中每个语句都有返回值.这一模式很明显 ...
- win7-BIOS中开启AHCI模式电脑蓝屏怎么办?
win7-BIOS中开启AHCI模式电脑蓝屏怎么办? 来源:U大师 u盘装系统 不少网友都表示给电脑安装win7系统后,如果在BIOS中开启IDE模式就一切正常而为AHCI模式时就会出现蓝屏.其实那是 ...
- Java——异常处理
1.java提供的异常不可能预见所有的问题,所以需要自己定义异常类,必须从已有的异常类继承,最好选择意思相近的异常类继承. class MyException extends Exception{} ...
- Spring 2017 Assignments3
一.作业要求 原版:http://cs231n.github.io/assignments2017/assignment3/ 翻译:http://www.mooc.ai/course/268/lear ...