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 树上计数
题意:有一颗数,每个点有一个颜色,定义两点之间的距离为两点路径之间不同颜色的数目,问所有路径的距离和是多少? 思路:每个颜色的贡献为路径中有这个颜色的路径数.先假设所有路径都会经过一种颜色,再减去不会 ...
随机推荐
- [bug系列]Method not found: 'Void Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommandBuilderFactory
bug由来 最近开始学习NetCore,想通过实战使用NetCore做一个集成数据库存储Redis缓存的WebApi项目,由于MSSQL的庞大体积,最终决定使用轻量级关系型数据库MySql. 所以最终 ...
- Bootstrap 固定在顶部导航条
@{ Layout = null;}<!DOCTYPE html><html><head> <meta name="viewport&q ...
- xadmin下设置“use_bootswatch = True”无效解决方法
from xadmin import viewsimport xadmin class BaseSetting(object): enable_themes=True use_bootswatch=T ...
- 使用ServiceStack.Redis实现Redis数据读写
原文:使用ServiceStack.Redis实现Redis数据读写 User.cs实体类 public class User { public string Name { get; set; } p ...
- WebAPI增加Area以支持无限层级同名Controller
原文:WebAPI增加Area以支持无限层级同名Controller 微软的WebAPI默认实现逻辑 默认实现中不支持同名Controller,否则在访问时会报HttpError,在网上找到了各种路由 ...
- NBU客户端安装失败
该服务器是阿里云上的centos6.8,是用来做oracle服务器,买来之后进行测试,发现没有安装图形化界面,还有部分包也没有安装.在oracle安装完成之后,尝试安装NBU的客户端,结果发生报错:T ...
- MIPS开发板的“不二”选择——Creator Ci20单板计算机评测(芯片是君正JZ4780 ,也就是MIPS R3000,系统推荐Debian或深度,官网就有,其它语言有FreePascal和Go和Java和Python)
在MIPS架构的CPU上开发软件,当然需要使用MIPS专用的工具链来编译代码.不过一般的LINUX发行版内都有相应的配套工具链供用户使用.Ci20出厂时的LINUX发行版为DEBIAN 7.5,相应的 ...
- UWP ListView嵌套ListView
要求:加载全部的订单,每个订单里面有一个或者多个产品,在列表中要展现出来, 1. xaml界面 步骤:1.这里使用的是x:bind绑定所以要引入实体类命名空间(OrderList集合中类的命名空间): ...
- easyui tree后台传json处理问题
一.tree json格式 [ { "id": 1, "text": "权限管理", "iconCls": " ...
- c# 叫号小程序
写个叫号的小demo 长相如下 代码如下 using System; using System.Collections.Generic; using System.ComponentModel; us ...