这里有三道长得像的题:

一:HDU6036:

There is a tree with nn nodes, each of which has a type of color represented by an integer, where the color of node ii is cici.

The path between each two different nodes is unique, of which we define the value as the number of different colors appearing in it.

Calculate the sum of values of all paths on the tree that has n(n−1)/2 paths in total.

InputThe input contains multiple test cases.

For each test case, the first line contains one positive integers nn, indicating the number of node. (2≤n≤200000)(2≤n≤200000)

Next line contains nn integers where the ii-th integer represents cici, the color of node ii. (1≤ci≤n)(1≤ci≤n)

Each of the next n−1n−1 lines contains two positive integers x,yx,y (1≤x,y≤n,x≠y)(1≤x,y≤n,x≠y), meaning an edge between node xx and node yy.

It is guaranteed that these edges form a tree.OutputFor each test case, output " Case #xx: yy" in one line (without quotes), where xxindicates the case number starting from 11 and yy denotes the answer of corresponding case.Sample Input

3
1 2 1
1 2
2 3
6
1 2 1 3 2 1
1 2
1 3
2 4
2 5
3 6

Sample Output

Case #1: 6
Case #2: 29

题意:求出所有路径的颜色种类之和。

二:洛谷P2664

题目描述

lrb有一棵树,树的每个节点有个颜色。给一个长度为n的颜色序列,定义s(i,j) 为i 到j 的颜色数量。以及

现在他想让你求出所有的sum[i]

输入输出格式

输入格式:

第一行为一个整数n,表示树节点的数量

第二行为n个整数,分别表示n个节点的颜色c[1],c[2]……c[n]

接下来n-1行,每行为两个整数x,y,表示x和y之间有一条边

输出格式:

输出n行,第i行为sum[i]

输入样例#1:


1 2 3 2 3 
1 2 
2 3 
2 4 
1 5

输出样例#1:

10 

11 

12

说明

sum[1]=s(1,1)+s(1,2)+s(1,3)+s(1,4)+s(1,5)=1+2+3+2+2=10 
sum[2]=s(2,1)+s(2,2)+s(2,3)+s(2,4)+s(2,5)=2+1+2+1+3=9 
sum[3]=s(3,1)+s(3,2)+s(3,3)+s(3,4)+s(3,5)=3+2+1+2+3=11 
sum[4]=s(4,1)+s(4,2)+s(4,3)+s(4,4)+s(4,5)=2+1+2+1+3=9 
sum[5]=s(5,1)+s(5,2)+s(5,3)+s(5,4)+s(5,5)=2+3+3+3+1=12

对于40%的数据,n<=2000 
对于100%的数据,1<=n,c[i]<=10^5

 题意:求出每个点到其他点路径的颜色种类和。

三:Wannafly挑战赛19C:多彩的树

有一棵树包含 N 个节点,节点编号从 1 到 N。节点总共有 K 种颜色,颜色编号从 1 到 K。第 i 个节点的颜色为 Ai
Fi 表示恰好包含 i 种颜色的路径数量。请计算:

输入描述:

第一行输入两个正整数 N 和 K,N 表示节点个数,K 表示颜色种类数量。
第二行输入 N 个正整数, 表示节点的颜色。
接下来 N - 1 行,第 i 行输入两个正整数 Ui 和 Vi,表示节点 Ui 和节点 Vi 之间存在一条无向边,数据保证这 N-1 条边连通了 N 个节点。
1 ≤ N ≤ 50000.
1 ≤ K ≤ 10.
1 ≤ Ai ≤ K.

输出描述:

输出一个整数表示答案。

输入例子:
5 3
1 2 1 2 3
4 2
1 3
2 1
2 5
输出例子:
4600065

-->

示例1

输入

5 3
1 2 1 2 3
4 2
1 3
2 1
2 5

输出

4600065

题意:对于L=[1,K],统计有多少路径的颜色种类=L;

------------------------------------------分界线-------------------------------------------------

对于第三题,可以容斥搞定。 前面两题可以借助虚树来做。

第三题,容斥,因为K<=10,只有2^K种颜色组合,按照每种颜色组合,用并查集分块。求出块的数量...反正一系列常规操作,最后容斥减去,这里和虚树无关,就不讲了。

第二题,因为要针对每一个点来求,所以考虑虚树加差分。

第一题,因为只计算最后的总结果,所以可以直接一次性操作完。

具体的,对于第二题:对于每种颜色,我们用是这种颜色的点来建立虚树,假设现在按照颜色C得到了一个虚树:虚树的边代表了一个不含颜色C的连通块,还有一些不含颜色C的连通块在虚树的叶子节点下边的连通块虚树的根的上面的连通块。 对于C颜色对其他点的贡献:颜色是C的点,显然它的结果是N,(即它到每个点的路径都会包含这种颜色);否则,它的结果是N-所在连通块的大小。 因为一个连通块的结果是相同的,所以我们用差分来统计:即在这个连通块的最高点+ans,所有最低点的儿子-ans,那么求得的前缀和就是结果。            每种颜色都这么干,最后累加一次前缀和,得到每个点的结果。复杂度就是O(N*17)。17是求LCA的复杂度。

对于第一题:可以像第二题那么干,那么ans=(Σ sum[i] )/2。

也可以用更高效的统计方法。 假设有num种颜色,那么初始值为N*(N-1)/2*num,然后对每种颜色,减去没有贡献的部分,同样需要用虚树的思想去想,但是累计的时候一起累计,不必要每种颜色真的去建立虚树,那么一次DFS就可以完事了。

一次DFS,当前节点为u,颜色为C,那么考虑颜色和u相同的这可虚树,u下方是一个颜色非C的连通块,大小为X,这个连通块没有贡献的部分为X*(X-1)/2;(所以就是想象C颜色的虚树),最后C颜色没有统计的部分为虚树的根上面部分,假设虚树的子树大小为sz[root],没有贡献的部分大小为(N-sz[root])*(N-sz[root]-1)/2;

那么关键就在于如何统计当前C颜色下面非C的连通块大小,用DP的思路去搞就行了。对于子树,每一条链,累加最高的点的子树大小。blabla...

【可以参考】:https://blog.csdn.net/Bahuia/article/details/76141574

第一题代码:没有实际去建虚树,但是有虚树的思想。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=;
int Laxt[maxn],Next[maxn<<],To[maxn<<],vis[maxn];
int a[maxn],col[maxn],sz[maxn],cnt;
ll sum[maxn],ans;
void add(int u,int v) { Next[++cnt]=Laxt[u]; Laxt[u]=cnt; To[cnt]=v; }
void dfs(int u,int f)
{
ll all=; sz[u]=;
for(int i=Laxt[u];i;i=Next[i]){
if(To[i]==f) continue;
ll pre=sum[col[u]];
dfs(To[i],u);
sz[u]+=sz[To[i]];
ll add=sum[col[u]]-pre; //add的当前颜色的空白连通块大小
ans-=(ll)(sz[To[i]]-add)*(sz[To[i]]-add-)/;
all+=sz[To[i]]-add;
}
sum[col[u]]+=(ll)all+;
}
int main()
{
int N,Case=,num,u,v,i,j;
while(~scanf("%d",&N)){
memset(Laxt,,sizeof(Laxt));
memset(sum,,sizeof(sum));
cnt=; num=; Case++;
for(i=;i<=N;i++) {
scanf("%d",&col[i]);
if(vis[col[i]]!=Case) a[++num]=col[i],vis[col[i]]=Case;
}
for(i=;i<N;i++) {
scanf("%d%d",&u,&v);
add(u,v); add(v,u);
}
ans=(ll)N*(N-1LL)/*num;
dfs(,);
for(i=;i<=num;i++) ans-=(N-sum[a[i]])*(N-sum[a[i]]-1LL)/; //减去当前颜色的根是上面连通块
printf("Case #%d: %lld\n",Case,ans);
}
return ;
}

HDU-6035:Colorful Tree(虚树+DP)的更多相关文章

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

  2. HDU 6035 Colorful Tree (树形DP)

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

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

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

  4. hdu 6035 Colorful Tree(虚树)

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

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

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

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

  7. HDU 6035 Colorful Tree(dfs)

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

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

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

  9. bzoj 3572世界树 虚树+dp

    题目大意: 给一棵树,每次给出一些关键点,对于树上每个点,被离它最近的关键点(距离相同被标号最小的)控制 求每个关键点控制多少个点 分析: 虚树+dp dp过程如下: 第一次dp,递归求出每个点子树中 ...

  10. bzoj 2286 [Sdoi2011]消耗战 虚树+dp

    题目大意:多次给出关键点,求切断边使所有关键点与1断开的最小费用 分析:每次造出虚树,dp[i]表示将i和i子树与父亲断开费用 对于父亲x,儿子y ①y为关键点:\(dp[x]\)+=\(dismn( ...

随机推荐

  1. NativeBase自定义组件样式

    http://nativebase.io/docs/v0.5.13/customize#themingNativeBaseApp 对于NativeBase中的组件,我们可以根据实际需要来进行自定义组件 ...

  2. 巧用Excel提高工作效率

    程序员如何巧用Excel提高工作效率 主要讲解下Excel中VLOOKUP函数的使用,相比于上一篇中的内容,个人觉得这个相对高级一些. 1.使用背景 为什么会使用到这个函数呢,背景是这样的,有两个系统 ...

  3. firfox浏览器常用快捷键

    Ctrl + 数字键来打开第N个标签页这种还要先数完再到键盘上找数字Ctrl + Page Up = 激活左边一个标签页Ctrl + Page Down = 激活右边一个标签页Ctrl + Tab = ...

  4. SQL Server 存储过程的几种常见写法分析,我们该用那种写法

    本文出处: http://www.cnblogs.com/wy123/p/5958047.html 最近发现还有不少做开发的小伙伴,在写存储过程的时候,在参考已有的不同的写法时,往往很迷茫,不知道各种 ...

  5. 苹果开发之COCOA编程(第三版)下半部分

    第十八章:Image和鼠标事件 1.NSResponderNSView继承自NSResponder类.所有的事件处理方法都定义在NSResponder类中.NSResponder申明了如下方法:- ( ...

  6. php 算法之------------怎样打印出下图

    自己偶尔看到了下图.于是用php打印出下图. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGluZ2ppZ29uZ3Np/font/5a6L5L2T/f ...

  7. http协议详解-经典篇

    本文转载至 http://www.cnblogs.com/flychen/archive/2012/11/28/2792206.html   ————————————————————————————— ...

  8. IOS开发之----异常处理

    本文转载至 http://blog.csdn.net/chenyong05314/article/details/7906593 转载自:http://blog.sina.com.cn/s/blog_ ...

  9. php xmlrpc使用示例

    xmlrpc 远程过程调用, 使用xml文本方式传输数据. soap协议比xmlrpc复杂并强大. 1.修改 php.ini,开启 xmlrpc 扩展 2.rpc_client.php <?ph ...

  10. Smarty入门学习

    --------------------------------- 安装和设置 --------------------------------- require('../Smarty/Smarty. ...