题意略。

思路:有n * (n - 1) / 2这么多边,要枚举是不可能的,感觉和数据结构也沾不上边。再加上树上染色,以一条边上不同颜色作为这个边的值,这看起来像是算贡献那种题,和17icpc沈阳的某题有点像。

那么,我们要枚举每个边不行,不如就假设所有边上都有全部颜色,然后再减去sum(wi)[wi是第i种颜色在多少边上没出现]。

为了计算wi,我们需要知道,如果在树上的一个联通块内,不包含颜色i,那么这个联通块(假设它的点数是k)内的这k * (k - 1) / 2条边都会对wi产生贡献。

那么我们的目标就是找出所有对wi产生贡献的联通块,此时我们可以利用树的性质:siz(某个联通块) =  siz(根) -  siz(子树);

当然,我们算贡献要以子树为单位计算贡献。

定义:sum[color[cur]] = 搜索到当前节点,颜色为color[cur]的各个最高子树的节点之和。

详见代码:

#include<bits/stdc++.h>
#define maxn 200050
using namespace std;
typedef long long LL; LL siz[maxn],color[maxn],sum[maxn],visit[maxn],colors;
LL contri;
vector<int> graph[maxn]; LL dfs(int cur,int fa){
siz[cur] = ;
LL allgap = ;
for(int i = ;i < graph[cur].size();++i){
int chi = graph[cur][i];
if(chi == fa) continue;
LL keep = sum[color[cur]];
siz[cur] += dfs(chi,cur);
LL gap = siz[chi] - (sum[color[cur]] - keep);
contri += gap * (gap - ) / ;
allgap += gap;
}
sum[color[cur]] += (allgap + );
return siz[cur];
}
void init(){
for(int i = ;i < maxn;++i) graph[i].clear();
memset(visit,,sizeof(visit));
memset(sum,,sizeof(sum));
colors = contri = ;
} int main(){
LL cas = ,n;
while(scanf("%lld",&n) == ){
init();
for(int i = ;i <= n;++i){
scanf("%lld",color + i);
if(visit[color[i]] == ){
visit[color[i]] = ;
++colors;
}
}
int x,y;
LL ans = (n * (n - )) / * colors;
for(int i = ;i < n - ;++i){
scanf("%d%d",&x,&y);
graph[x].push_back(y);
graph[y].push_back(x);
}
dfs(,);
for(int i = ;i <= n;++i){
if(visit[i]){
contri += (n - sum[i]) * (n - sum[i] - ) / ;
}
}
printf("Case #%lld: %lld\n",cas++,ans - contri);
}
return ;
}

其中求联通块的点数用到了取差值的方法,gap就是联通块的大小,最后的sum[color[cur]] += (allgap + 1)的意思是,这些联通块本身也是子树的一部分,在算最高子树的时候也应计入在内,那个1表示的是

根节点。

最后contri += (n - sum[i]) * (n - sum[i] - 1) / 2;这是因为我们在算联通块的时候其实都是在算子树的联通块,未能把根节点算在内,这里要补上,是因为已经到整棵树的根节点了,不会再有父节点了。

带给我的收获:

1.正面不行的时候可以考虑反面。

2.联通块与边的关系。

3.联通块size的计算。

HDU 6035(树形dp)的更多相关文章

  1. hdu 6035(树形dp)

    题意:给你棵树,树上每个节点都有颜色,每条路径上有m种颜色  问你所有路径上出现的颜色的和 思路:答案求的是每种颜色对路径的贡献  我们可以反过来每种颜色不经过的路径的条数 假设根节点的颜色为x  我 ...

  2. hdu 4123 树形DP+RMQ

    http://acm.hdu.edu.cn/showproblem.php? pid=4123 Problem Description Bob wants to hold a race to enco ...

  3. HDU 1520 树形dp裸题

    1.HDU 1520  Anniversary party 2.总结:第一道树形dp,有点纠结 题意:公司聚会,员工与直接上司不能同时来,求最大权值和 #include<iostream> ...

  4. HDU 1561 树形DP入门

    The more, The Better Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  5. HDU 2196树形DP(2个方向)

    HDU 2196 [题目链接]HDU 2196 [题目类型]树形DP(2个方向) &题意: 题意是求树中每个点到所有叶子节点的距离的最大值是多少. &题解: 2次dfs,先把子树的最大 ...

  6. HDU 1520 树形DP入门

    HDU 1520 [题目链接]HDU 1520 [题目类型]树形DP &题意: 某公司要举办一次晚会,但是为了使得晚会的气氛更加活跃,每个参加晚会的人都不希望在晚会中见到他的直接上司,现在已知 ...

  7. codevs 1380/HDU 1520 树形dp

    1380 没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 回到问题 题目描述 Description Ural大学有N个职员 ...

  8. HDU 5834 [树形dp]

    /* 题意:n个点组成的树,点和边都有权值,当第一次访问某个点的时候获得利益为点的权值 每次经过一条边,丢失利益为边的权值.问从第i个点出发,获得的利益最大是多少. 输入: 测试样例组数T n n个数 ...

  9. hdu 4267 树形DP

    思路:先dfs一下,找出1,n间的路径长度和价值,回溯时将该路径长度和价值清零.那么对剩下的图就可以直接树形dp求解了. #include<iostream> #include<al ...

随机推荐

  1. crypto在web的使用

    前言 crypto 在nodejs中是一个核心模块,虽然现在高等浏览器中也有了crypto全局对象(下图),它在nodejs中的使用与web端还是不同的. web端使用cryptojs 国外下载较慢, ...

  2. IDEA新建Maven项目

    Maven是什么? 当我们在开发一个项目的时候,不可避免地会使用到第三方的类库,而它们又可能依赖着另外的Jar包,又得引入其他Jar包,而且我们很容易就会引漏掉~然后就会报错,有时候报的错会让我们花掉 ...

  3. 错误:This function has none of DETERMINISTIC... 的解决

    问题: 在MySQL创建了一个批量插入的存储过程,在代码中调用的时候报错误信息: error code [1418];This function has none of DETERMINISTIC, ...

  4. java URL和URLConnection

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  5. TOMCAT原理详解及请求过程

    Tomcat: Tomcat是一个JSP/Servlet容器.其作为Servlet容器,有三种工作模式:独立的Servlet容器.进程内的Servlet容器和进程外的Servlet容器. Tomcat ...

  6. 小谈ConcurrentHashMap

    面试的时候被面试官问了点相关知识,再次记录一些自己的总结 一. 1.HashTable也可实现线程安全,但是它是用synchronized实现的,所以其他线程访问HashTable的同步方法时,可能会 ...

  7. 101490E Charles in Charge

    题目连接 http://codeforces.com/gym/101490 题目大意 你有一张图,每两点之间有一定距离,计算出比最短路大x%之内的路径中最长边的最小值 分析 先跑一遍最短路,然后二分答 ...

  8. execl列数据成等差递增递减

    如上图若想以10,20,30...这样递增: 1).首先需选中10,20所在的单元格,鼠标移至20所在的单元格右下角 2).此时会出现一个十字"十"符号,点击直向下拖动至某个地方, ...

  9. 《NET 设计规范》第 2 章 框架设计基础

    <NET 设计规范>第 2 章 框架设计基础 要设计功能强大又易于使用的框架. 要理解广大开发人员并有针对性地为他们设计框架. 要理解各种编程语言,并为他们设计框架. 2.1 渐进框架 2 ...

  10. ABP官方文档翻译 6.3 本地化

    本地化 介绍 应用程序语言 本地化源 XML文件 注册XML本地化源 JSON文件 注册JSON本地化源 资源文件 自定义源 当前语言是如何决定的 ASP.NET Core ASP.NET MVC 5 ...