考虑到树上操作;
首先题目要我们求每条路径上出现不同颜色的数量,并把所有加起来得到答案;
我们知道俩俩点之间会形成一条路径,所以我们可以知道每个样例的总的路径的数目为: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(虚树)的更多相关文章

  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. 【数据库】SQL 关系代数

    环境:MySQL ID:MySQL WorkBench 6.3 CE 实现以下有点难度的关系除法. 先给定义: 除运算是同时从关系的水平方向和垂直方向进行运算.给定关系R(X,Y)和S(Y,Z),X. ...

  2. class选择器,外部样式表,选择器优先级

    class选择器: 先在相应标签中设置一个class属性,如class=“class名”.class名{ ……css样式}注:class名以英文字母开头,可以多个标签重复使用.优先级:标签名选择器 & ...

  3. Q7:Reverse Integer

    7. Reverse Integer 官方的链接:7. Reverse Integer Description : Given a 32-bit signed integer, reverse dig ...

  4. springBoot中的邮件发送

    1. 添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  5. 微信小程序下载图片到本地

    downloadImg: function(e){ //触发函数 console.log(e.currentTarget.dataset.url) wx.downloadFile({ url: e.c ...

  6. ZOJ 3765 Lights (zju March I)伸展树Splay

    ZJU 三月月赛题,当时见这个题目没辙,没学过splay,敲了个链表TLE了,所以回来好好学了下Splay,这道题目是伸展树的第二题,对于伸展树的各项操作有了更多的理解,这题不同于上一题的用指针表示整 ...

  7. Java线程——线程池概念

    什么是线程池? 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间.那么有没有一种办法使得线程可以复用, ...

  8. KAFKA伪集群单机安装

    下载 kafka_2.11-2.0.1.tgz 文档kafka_2.11-2.0.1-site-docs.tgz cd /uae/local tar -zxvf kafka_2.11-2.0.1.tg ...

  9. java查看简单GC日志

    测试代码: public class GCtest { public static void main(String[] args) { for (int i = 0; i < 10000; i ...

  10. atomic一定线程安全吗

    atomic只是保证了操作的原子性,原子操作即一个操作不可再分. atomic只是对读写操作进行了加锁,保证了多线程开发时一个读写操作完成之后才能进行下一个读写操作 atomic和线程安全没有太大的关 ...