考虑到树上操作;
首先题目要我们求每条路径上出现不同颜色的数量,并把所有加起来得到答案;
我们知道俩俩点之间会形成一条路径,所以我们可以知道每个样例的总的路径的数目为:n*(n-1)/2;

这样单单的求,每条路径(n:2e5)无疑会爆;

这样我们假设所有路径上都存在所有的颜色,所有总的答案为n*(n-1)/2*n;

然后我们再在里面减去我们不需要的;

这里我们要运用虚树(当前图的信息整合而已)的思想,其实也没有建出一颗树;

对于一个顶点u,颜色为x,在它的子树内所有以颜色x为根的子树都要舍去;//这个过程用dfs实现

代码又注释其中过程

  1. #include<iostream>
  2. #include<vector>
  3. #include<cstdio>
  4. #include<algorithm>
  5. #include<cstring>
  6. #include<vector>
  7. using namespace std;
  8.  
  9. typedef long long ll;
  10. const int M=2e5+5;
  11.  
  12. vector < int > e[M];
  13. int top[M];////此时颜色为i的联通块的top
  14. int col[M];
  15. int a[M];//以i为根节点的子树中,不在i所在的联通块中节点的number
  16. int b[M];//以颜色i为分界线,不在根节点所在的联通块中的节点个数
  17. ll n,ans;
  18. int dfs(int u,int f){
  19. int u_sz=1,curtop=top[col[u]];
  20. top[col[u]]=u;
  21. for(int i=0;i<e[u].size();i++){
  22. int v=e[u][i];
  23. if(v!=f){
  24. a[u]=0;
  25. int v_sz=dfs(v,u);
  26. ll x=v_sz-a[u];
  27. ans-=x*(x-1)/2;
  28. u_sz+=v_sz;
  29. }
  30. }
  31. if(curtop){
  32. a[curtop]+=u_sz;
  33. }
  34. else
  35. b[col[u]]+=u_sz;
  36. top[col[u]]=curtop;
  37. return u_sz;
  38. }
  39. int main(){
  40. int sign=1;
  41. while(~scanf("%lld",&n)){
  42. for(int i=0;i<=n;i++){
  43. e[i].clear();
  44. a[i]=0,b[i]=0;
  45. top[i]=0;
  46. }
  47. for(int i=1;i<=n;i++)
  48. scanf("%d",&col[i]);
  49. for(int i=1;i<n;i++){
  50. int x,y;
  51. scanf("%d%d",&x,&y);
  52. e[x].push_back(y);
  53. e[y].push_back(x);
  54. }
  55. ans=n*(n-1)/2*n;
  56. // cout<<ans<<endl;
  57. dfs(1,-1);
  58. for(int i=1;i<=n;i++){//这一步是因为dfs中没有对根节点进行操作
  59. ll x=n-b[i];
  60. ans-=x*(x-1)/2;
  61. }
  62. printf("Case #%d: %lld\n",sign++,ans);
  63. }
  64. return 0;
  65. }

  

hdu 6035 Colorful Tree(虚树)的更多相关文章

  1. HDU 6035 - Colorful Tree | 2017 Multi-University Training Contest 1

    /* HDU 6035 - Colorful Tree [ DFS,分块 ] 题意: n个节点的树,每个节点有一种颜色(1~n),一条路径的权值是这条路上不同的颜色的数量,问所有路径(n*(n-1)/ ...

  2. 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 ...

  3. HDU 6035 Colorful Tree(补集思想+树形DP)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6035 [题目大意] 给出一颗树,一条路径的价值为其上点权的种类数,求路径总价值 [题解] 单独考虑 ...

  4. 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 ...

  5. HDU 6035 Colorful Tree(dfs)

    题意:一棵有n个点的树,树上每个点都有颜色c[i],定义每条路径的值为这条路径上经过的不同颜色数量和.求所有路径的值的和. 可以把问题转化为对每种颜色有多少条不同的路径至少经过这种颜色的点,然后加和. ...

  6. HDU 6035 Colorful Tree (树形DP)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6035 [题目大意] 给出一颗树,一条路径的价值为其上点权的种类数,求路径总价值 [题解] 我们计算 ...

  7. hdu 6035:Colorful Tree (2017 多校第一场 1003) 【树形dp】

    题目链接 单独考虑每一种颜色,答案就是对于每种颜色至少经过一次这种的路径条数之和.反过来思考只需要求有多少条路径没有经过这种颜色即可. 具体实现过程比较复杂,很神奇的一个树形dp,下面给出一个含较详细 ...

  8. HDU 3333 Turing Tree 线段树+离线处理

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3333 Turing Tree Time Limit: 6000/3000 MS (Java/Othe ...

  9. HDU 3333 Turing Tree (线段树)

    Turing Tree Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

随机推荐

  1. Linux 目录变化监听 - python代码实现

    在python中 文件监控主要有两个库, 一个是pyinotify ( https://github.com/seb-m/pyinotify/wiki ),pyinotify依赖于Linux平台的in ...

  2. LinkedList源码阅读笔记

    LinkedList LinkedList是双向链表,不循环(1.6之前循环),继承AbstractSequentialList类,实现了List, Deque, Cloneable接口. 链表的特点 ...

  3. Tensorflow学习教程------简单练一波,线性模型

    #coding:utf-8 import tensorflow as tf import numpy as np #使用numpy 生成100个随机点 x_data = np.random.rand( ...

  4. JSP编码问题解决方法

    最近再看JSP相关知识,被中文乱码搞的很头大.找了好多方法终于找到了一个简单可行的方案. JSP中request和response操作默认编码为"ISO-8859-1",这是中文乱 ...

  5. [NOI2017]蔬菜(贪心+递推)

    这题很有思维难度,乍一看基本无从下手. 给每个蔬菜钦定退役的时间显然很困难,可以考虑让时光倒流,从后向前递推,然后就变成了某个时间点有一部分蔬菜服役,而已经服役的蔬菜不会退役了.然后就可以直接考虑贪心 ...

  6. 工程日记之HelloSlide(1):Swift自定义可视化组件的方法(继承UIView和在StoryBoard中设置)

    需求描述 HelloSlide是把文本自动转化成幻灯片的软件,在幻灯片中我们有SmartArt:各种各样的几何形状,并且可以自定义大小和颜色,放在幻灯片不同的位置. 为了在我们的软件中实现类似的效果, ...

  7. 当切换用户时出现-bash-4.1$

    问题重现 [root@localhost ~]# su - yh -bash-4.1$ -bash-4.1$ -bash-4.1$ -bash-4.1$ -bash-4.1$ cd /home -ba ...

  8. SQL基础教程(第2版)第3章 聚合与排序:练习题

    存在以下 个错误. .使用了字符类型的列(product_name)作为 SUM 函数的参数. >> 解答 SUM 函数只能使用数值类型的列作为参数. . WHERE 子句写在了 GROU ...

  9. python logging的输出

    ---恢复内容开始--- python中logging的使用 什么是日志: 日志是一种可以追踪某些软件运行时所发生事件的方法 软件开发人员可以向他们的代码中调用日志记录相关的方法来表明发生了某些事情 ...

  10. python:创建文件夹:写入文本1:读取txt:读取Excel文件遍历文件夹:

    https://blog.csdn.net/u011956147/article/details/80369731 创建文件夹: import osimport shutil def buildfil ...