HDU 6043:Colorful Tree(树上统计所有路径总颜色数)***
题意
给出一棵有n个结点的树,每个结点有一个颜色,问在这棵树的所有路径中,每条路径的颜色数求和是多少。
思路
求每种颜色的贡献可以转化为总的和减去每种颜色在哪些路径上没有出现的贡献,一个颜色在树块中的贡献为sz*(sz-1)/2。
这个题就是把一棵树分成许多个树块然后统计。
1号结点为一个所有颜色都有的点,特殊处理,否则当某种颜色在树的下面而且不是和根节点同一种颜色的时候,就无法进行计算了。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const int N = 2e5 + 10;
vector<int> g[N];
int n, col[N], facol[N], fason[N];
LL num[N], root[N], sz[N];
/*
* 求每种颜色的贡献可以转化为总的和减去每种颜色在哪些路径上没有出现的贡献
* 一个颜色在树块中的贡献为sz*(sz-1)/2
* 这个题就是把一棵树分成许多个树块然后统计。
* 1号结点为一个所有颜色都有的点,这样可以方便统计
* facol[col[u]]表示和第u个点同样的颜色的离得最近的祖先的儿子是什么
* fason[u]是facol[col[u]]的简化,表示第u个点离得最近的祖先的儿子是什么
* num[u]表示u这个点的父结点的颜色在u这个分支块所统治的树块的大小
* root[col]表示第col种颜色与根节点的树块的大小
*/
void dfs(int u, int f) {
fason[u] = facol[col[u]];
sz[u] = 1;
for(int i = 0; i < g[u].size(); i++) {
int v = g[u][i]; if(v == f) continue;
facol[col[u]] = v;
dfs(v, u);
facol[col[u]] = fason[u];
sz[u] += sz[v];
// num[u] += sz[v];
}
// printf("%d : %d - %d - %lld - %lld - %lld\n", u, col[u], fason[u], num[u], root[col[u]], sz[u]);
num[u] += sz[u];
if(fason[u] == 1) root[col[u]] -= sz[u];
else num[fason[u]] -= sz[u];
}
LL solve() {
for(int i = 0; i <= n; i++) g[i].clear();
for(int i = 1; i <= n; i++) scanf("%d", &col[i]);
for(int i = 1; i < n; i++) {
int u, v;
scanf("%d%d", &u, &v);
g[u].push_back(v);
g[v].push_back(u);
}
for(int i = 1; i <= n; i++) root[i] = n, facol[i] = 1, num[i] = 0;
dfs(1, 1);
LL ans = 1LL * n * n * (n - 1) / 2;
for(int i = 2; i <= n; i++) ans -= num[i] * (num[i] - 1) / 2;
for(int i = 1; i <= n; i++) ans -= root[i] * (root[i] - 1) / 2;
return ans;
}
int main() {
int cas = 1;
while(~scanf("%d", &n))
printf("Case #%d: %lld\n", cas++, solve());
return 0;
}
HDU 6043:Colorful Tree(树上统计所有路径总颜色数)***的更多相关文章
- HDU 6035 - Colorful Tree | 2017 Multi-University Training Contest 1
/* HDU 6035 - Colorful Tree [ DFS,分块 ] 题意: n个节点的树,每个节点有一种颜色(1~n),一条路径的权值是这条路上不同的颜色的数量,问所有路径(n*(n-1)/ ...
- 2017 Multi-University Training Contest - Team 1 1003&&HDU 6035 Colorful Tree【树形dp】
Colorful Tree Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- HDU 6035 Colorful Tree (树形DP)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6035 [题目大意] 给出一颗树,一条路径的价值为其上点权的种类数,求路径总价值 [题解] 我们计算 ...
- 2017ACM暑期多校联合训练 - Team 1 1003 HDU 6035 Colorful Tree (dfs)
题目链接 Problem Description There is a tree with n nodes, each of which has a type of color represented ...
- HDU 6035 Colorful Tree(dfs)
题意:一棵有n个点的树,树上每个点都有颜色c[i],定义每条路径的值为这条路径上经过的不同颜色数量和.求所有路径的值的和. 可以把问题转化为对每种颜色有多少条不同的路径至少经过这种颜色的点,然后加和. ...
- HDU 6035 Colorful Tree(补集思想+树形DP)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6035 [题目大意] 给出一颗树,一条路径的价值为其上点权的种类数,求路径总价值 [题解] 单独考虑 ...
- hdu 6035 Colorful Tree(虚树)
考虑到树上操作:首先题目要我们求每条路径上出现不同颜色的数量,并把所有加起来得到答案:我们知道俩俩点之间会形成一条路径,所以我们可以知道每个样例的总的路径的数目为:n*(n-1)/2: 这样单单的求, ...
- hdu 6035:Colorful Tree (2017 多校第一场 1003) 【树形dp】
题目链接 单独考虑每一种颜色,答案就是对于每种颜色至少经过一次这种的路径条数之和.反过来思考只需要求有多少条路径没有经过这种颜色即可. 具体实现过程比较复杂,很神奇的一个树形dp,下面给出一个含较详细 ...
- gym/102253C Colorful Tree 树上计数
题意:有一颗数,每个点有一个颜色,定义两点之间的距离为两点路径之间不同颜色的数目,问所有路径的距离和是多少? 思路:每个颜色的贡献为路径中有这个颜色的路径数.先假设所有路径都会经过一种颜色,再减去不会 ...
随机推荐
- WPF 遍历DataTemplate(获取所有控件)
原文:WPF 遍历DataTemplate(获取所有控件) 情况1:在设定DataTemplate的Name,并且他是在前台表示时,获取DataTemplate里的指定控件. 方法: http://b ...
- node express4.x 的安装
4.x开始不再是 一个express就搞定一切了,需要装另外一个部署插件 具体: 跟着<nodejs开发指南>敲npm install -g express, 安装好了,就在linux命令 ...
- C# WPF 中用代码模拟鼠标和键盘的操作
原文:C# WPF 中用代码模拟鼠标和键盘的操作 原文地址 C#开发者都知道,在Winform开发中,SendKeys类提供的方法是很实用的.但是可惜的是,在WPF中不能使用这个方法了. 我们知道,在 ...
- Linux下基于Bluez
硬件:Moto H670 蓝牙耳机 (CSR chip)/ Broadcom v2.0 adapter软件:bluez-4.26 / bluez-gnome-1.8 / linux kernel 2. ...
- foreach获取索引值
List<" }; foreach (string item in items) { int index = items.IndexOf(item); Console.WriteLin ...
- TThread类详解
TThread是一个抽象类,可以创建几个独立的线程.类关系 TObject在一个多线程的应用程序中创建一个TThread的后子类代表一个线程.每一新子类的TThread对象的实例是一个新的线程.从TT ...
- PRML Chapter3
曲线拟合的几种方法 最大似然估计MLE,最大后验概率MAP:MLE和MAP MLE 给定一堆数据,假如我们知道它是从某一种分布中随机取出来的,可是我们并不知道这个分布具体的参,即"模型已定, ...
- 通过OSG实现对模型的日照模拟
目录 1. 加载模型 2. 光照 1) 环境反射 2) 漫反射 3) 日照方向 (1) 太阳高度角和太阳方位角 (2) 计算过程 4) 改进实现 3. 阴影 4. 太阳高度角与太阳方位角的计算 1) ...
- SYN1621型 定位定向授时设备
SYN1621型 定位定向授时设备 定位定向授时设备使用说明视频链接: http://www.syn029.com/h-pd-274-0_310_39_-1.html 请将此链接复制到浏览器打开观看 ...
- Python连载11-Python中os.path模块简介
一.os.path(和路径相关的木块) 1.函数:abspath() (1)含义:将路径转化为绝对路径的形式(absolute path) (2)格式:os.path.abspath(相对路径) (3 ...