hdu 6035 Colorful Tree(虚树)
考虑到树上操作;
首先题目要我们求每条路径上出现不同颜色的数量,并把所有加起来得到答案;
我们知道俩俩点之间会形成一条路径,所以我们可以知道每个样例的总的路径的数目为:n*(n-1)/2;
这样单单的求,每条路径(n:2e5)无疑会爆;
这样我们假设所有路径上都存在所有的颜色,所有总的答案为n*(n-1)/2*n;
然后我们再在里面减去我们不需要的;
这里我们要运用虚树(当前图的信息整合而已)的思想,其实也没有建出一颗树;
对于一个顶点u,颜色为x,在它的子树内所有以颜色x为根的子树都要舍去;//这个过程用dfs实现
代码又注释其中过程
#include<iostream>
#include<vector>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std; typedef long long ll;
const int M=2e5+5; vector < int > e[M];
int top[M];////此时颜色为i的联通块的top
int col[M];
int a[M];//以i为根节点的子树中,不在i所在的联通块中节点的number
int b[M];//以颜色i为分界线,不在根节点所在的联通块中的节点个数
ll n,ans;
int dfs(int u,int f){
int u_sz=1,curtop=top[col[u]];
top[col[u]]=u;
for(int i=0;i<e[u].size();i++){
int v=e[u][i];
if(v!=f){
a[u]=0;
int v_sz=dfs(v,u);
ll x=v_sz-a[u];
ans-=x*(x-1)/2;
u_sz+=v_sz;
}
}
if(curtop){
a[curtop]+=u_sz;
}
else
b[col[u]]+=u_sz;
top[col[u]]=curtop;
return u_sz;
}
int main(){
int sign=1;
while(~scanf("%lld",&n)){
for(int i=0;i<=n;i++){
e[i].clear();
a[i]=0,b[i]=0;
top[i]=0;
}
for(int i=1;i<=n;i++)
scanf("%d",&col[i]);
for(int i=1;i<n;i++){
int x,y;
scanf("%d%d",&x,&y);
e[x].push_back(y);
e[y].push_back(x);
}
ans=n*(n-1)/2*n;
// cout<<ans<<endl;
dfs(1,-1);
for(int i=1;i<=n;i++){//这一步是因为dfs中没有对根节点进行操作
ll x=n-b[i];
ans-=x*(x-1)/2;
}
printf("Case #%d: %lld\n",sign++,ans);
}
return 0;
}
hdu 6035 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 (2017 多校第一场 1003) 【树形dp】
题目链接 单独考虑每一种颜色,答案就是对于每种颜色至少经过一次这种的路径条数之和.反过来思考只需要求有多少条路径没有经过这种颜色即可. 具体实现过程比较复杂,很神奇的一个树形dp,下面给出一个含较详细 ...
- HDU 3333 Turing Tree 线段树+离线处理
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3333 Turing Tree Time Limit: 6000/3000 MS (Java/Othe ...
- HDU 3333 Turing Tree (线段树)
Turing Tree Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
随机推荐
- part11 Vue项目接口联调//真机测试
何为项目接口联调? 前端代码编译好了 后端接口写好了 我们就需要去掉前端模拟数据干掉 用后端提供的数据.进行前后端的一个调试 如何联调? config目录下面 index.js 文件 dev 中pr ...
- Codeforces 1291B - Array Sharpening
题目大意: 一个数列是尖锐的 当且仅当存在一个位置k使得 a[1]<a[2]<a[3]<...<a[k] 且 a[k]>a[k+1]>a[k+2]>...&g ...
- arp攻击 (可查看同一局域网他人手机照片)
国家法律一定要遵守,知识要用在对的地方. 本贴只为了和大家交流学习,请勿用在其他地方,损害任何人的利益. 今天我,来说一下arp攻击的原理和教程 原理什么的还是自行百度好,因为专业的说明是严谨而又经得 ...
- js 关联数组
踩得坑: JS ,通过 new Array()创建了一个数组: var param = new Array();param["key1"] = value1;param[&quo ...
- mysql自关联和多表连接查询
自关联操作 多表连接查询 inner join 内查询 left join 左查询 right join 右查询 ...
- js对象属性名和属性值生成新数组时都作为属性值
const obj = { id:1, name:'zhangsan', age:18 } const arr = []; Object.getOwnPropertyNames(obj).forEac ...
- ZooKeeper解决的问题
1.解决分布式单点问题 https://www.jianshu.com/p/08b76bd7a634 2.实现分布式环境数据的一致性.访问ZooKeeper树结构时,不同节点返回的数据是一致,不会引起 ...
- IO流的学习以及统计次数最多的单词
IO流: 处理数据类型:字节流(InputStream OutputStream)和字节流(Reader Writer) 数据流向不同:输入流和输出流(FileInputStream File ...
- 00java语法基础和课后实践
一:运行代码,并分析结果 代码1: package reserve; public class Main { public static void main(String[] args) { Size ...
- 更改php.ini配置
vi /etc/php.ini #编辑修改 @ini_set('memory_limit', '64M'); / ...