2017第一次多校联合 hdu6035Colorful Tree
来源:互联网 发布:linux 显示当前目录 编辑:程序博客网 时间:2024/06/05 02:36
假装这里有链接
题意:给你一棵树,树上每个节点都有颜色,然后要统计每种颜色参与了多少路径。
题解:首先,这题是真的难。(菜~菜~菜~…….)有看到网上有dalao说这题真的不难。。。。
要统计每种颜色参与了多少路径,那就算没参与多少路径,然后用总的减去就好了。
sum[x]表示的遍历到当前位置,颜色为x的高度最高一批结点为根的子树大小总和。
具体思路借鉴了这篇博客:链接
#include<bits/stdc++.h>using namespace std;#define ll long longconst int maxn=2e5+9;ll color[maxn],sum[maxn],sz[maxn],vis[maxn];vector <int> tree[maxn];ll ans=0;ll dfs(int u,int b){ sz[u]=1;//sz表示树的大小 ll temp=0; int l=tree[u].size(); for(int i=0;i<l;i++) { int v=tree[u][i];//v是子树 if(v==b)//b是父亲 continue; ll last=sum[color[u]];//关键在这里,这里会标记进行递归之前的该种颜色的值 sz[u]+=dfs(v,u); ll add=sum[color[u]]-last; //add可以理解为以u为根的子树中以u的颜色为根的子树大小 ans+=(sz[v]-add)*(sz[v]-add-1)/2; temp+=sz[v]-add;//temp就是不含u的颜色的联通块的节点数 } sum[color[u]]+=temp+1;//加上不含u的颜色的联通块的节点数和根节点u本身,此时sum在数值上与sz相同 return sz[u];}int main(){ ll int n,ca=1,a,b; while(~scanf("%d",&n)) { int m=0; memset(vis, 0, sizeof(vis)); memset(sum, 0, sizeof(sum)); for(int i=1; i<=n;i++) { scanf("%lld",&color[i]); if(!vis[color[i]]) { m++; } vis[color[i]]=1; tree[i].clear(); } for(int i=0; i<n-1; i++) { scanf("%d %d",&a,&b); tree[a].push_back(b); tree[b].push_back(a); } printf("Case #%d: ", ca++); if(m==1) { printf("%lld\n",n*(n-1)/2); continue; } ans=0; dfs(1,-1); for(int i=1;i<=n;i++) { if(!vis[i]) continue; ans+=(n-sum[i])*(n-sum[i]-1)/2;//处理没有考虑的情况 } printf("%lld\n",n*(n-1)/2*m-ans); }}
阅读全文
0 0
- 2017第一次多校联合 hdu6035Colorful Tree
- 2017第一次多校联合Balala Power!
- 2017第一次多校联合 1006Function
- 2017第一次多校联合 1011KazaQ's Socks
- 2017第一次多校联合 1001Add More Zero
- 2017 HDU 多校联合赛 Colorful Tree
- hdu4925Apple Tree【水】2014多校联合
- 暑期第一次多校联合赛 I题 数学题
- 对于第一次多校大一联合赛的感想
- 2017多校联合第三场/hdu6059 Kanade's trio(tire tree)
- 2017多校联合第六场String/hdu 6096 (tire tree/ac自动机)
- 2017ACM-TC联合第一次招新赛题解
- hdu5379 Mahjong tree DFS 多校联合第七场
- 【HDU 4863 多校联合】Centroid of a Tree【树形DP】
- hdu 5379 Mahjong tree 2015多校联合训练赛#7 dfs
- hdu 5378 Leader in Tree Land 2015多校联合训练赛 树形dp
- hdu 5398 GCD Tree 2015多校联合训练赛#9 LCT,动态生成树
- hdu 5416 CRB and Tree 2015多校联合训练赛#10 枚举
- 配置过程中的一些问题
- 集合一
- android中ViewPager禁止滑动
- 第3章-垃圾收集器与内存分配策略 第4章-虚拟机性能监控与故障处理工具
- linux 内核态用户态
- 2017第一次多校联合 hdu6035Colorful Tree
- 邮件发送和接收邮件原理
- ORACLE数据库 NVL 和 NVL2
- 【并查集】poj 1182 食物链
- kafka offset 新存储机制
- 集合二
- 51 Nod 1284 2 3 5 7的倍数(容斥原理)
- python排序,保留索引值
- 关于unity中的update、Lateupdate和FixedUpdate