(先奉上jcvb大神的官方题解)BC 76 div 1 1002

对于每个结点i,统计出f[i]表示包含i的连通集有多少个,那么容易看出答案就是所有f[i]的和。

要计算f[i]是经典的树形DP问题。令g[i]表示以i为根的连通集的数目,那么g[i]=∏(g[j]+1),

j是i的儿子,按这个从下往上DP一遍。

然后再用同样的式子从上往下DP一遍就好了。这一步骤写的时候要注意一下不要写错。

时间复杂度O(n)。

然后本蒟蒻不会这么写,因为一些人说需要逆元,而且这个题卡逆元,所以果断没有写

然后果断看了rank1的代码,然后写了一发,A掉了

蒟蒻大体说一下rank1的思路,看了半天请教学长才会

分析:题意是无根树,然后把它转化成有根树,这样每一个联通集都有一个跟节点

下面来定义g[i]代表以 i 为根节点的联通集的方案数,

f[i]代表以 i 为根节点的每个方案的大小之和

然后可见 ans就是所有f[i]的数量和

注:(这里的g[i]与官方题解一样,f[i]是不一样的)

代码:

#include <stdio.h>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long LL;
const int N=2e5+;
const LL mod=1e9+;
LL g[N],f[N],ans;
int T,n,head[N],tot;
struct Edge{
int v,next;
}edge[N<<];
void add(int u,int v){
edge[tot].v=v;
edge[tot].next=head[u];
head[u]=tot++;
}
void dfs(int u,int fa){
f[u]=g[u]=;
for(int i=head[u];~i;i=edge[i].next){
int v=edge[i].v;
if(v==fa)continue;
dfs(v,u);//处理子节点
f[u]=(f[u]*(g[v]+)%mod+g[u]*f[v]%mod)%mod;
//处理到当前子节点分支,如何得到当前f[u]
//进行分治,讨论连通集是否包含这个新分支中的点
//这就是上面的式子,我就是分治理解的
g[u]=g[u]*(g[v]+)%mod;
//得到当前子节点的以u为根的方案数
}
ans=(ans+f[u])%mod;
}
int main()
{
scanf("%d",&T);
while(T--){
scanf("%d",&n);
ans=tot=;
for(int i=;i<=n;++i)head[i]=-;
for(int i=;i<=n;++i){
int v;
scanf("%d",&v);
add(i,v),add(v,i);
}
dfs(,);
printf("%I64d\n",ans);
}
return ;
}

HDU5647 DZY Loves Connecting 树形DP的更多相关文章

  1. HDU 5647 DZY Loves Connecting 树形dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5647 题解: 令dp[u][0]表示u所在的子树中所有的包含i的集合数,设u的儿子为vi,则易知dp ...

  2. 【HDU 5647】DZY Loves Connecting(树DP)

    pid=5647">[HDU 5647]DZY Loves Connecting(树DP) DZY Loves Connecting Time Limit: 4000/2000 MS ...

  3. codeforces#FF DIV2C题DZY Loves Sequences(DP)

    题目地址:http://codeforces.com/contest/447/problem/C C. DZY Loves Sequences time limit per test 1 second ...

  4. CF446A DZY Loves Sequences 简单dp

    DZY has a sequence a, consisting of n integers. We'll call a sequence ai, ai + 1, ..., aj (1 ≤ i ≤ j ...

  5. Codeforces 447 C DZY Loves Sequences【DP】

    题意:给出一列数,在这个序列里面找到一个连续的严格上升的子串,现在可以任意修改序列里面的一个数,问得到的子串最长是多少 看的题解,自己没有想出来 假设修改的是a[i],那么有三种情况, 1.a[i]& ...

  6. Codeforces 446A. DZY Loves Sequences (线性DP)

    <题目链接> 题目大意: 给定一个长度为$n$的序列,现在最多能够改变其中的一个数字,使其变成任意值.问你这个序列的最长严格上升子段的长度是多少. #include <bits/st ...

  7. CodeForces - 446A DZY Loves Sequences(dp)

    题意:给定一个序列a,求最长的连续子序列b的长度,在至多修改b内一个数字(可修改为任何数字)的条件下,使得b严格递增. 分析: 1.因为至多修改一个数字,假设修改a[i], 2.若能使a[i] < ...

  8. HDU 5646 DZY Loves Partition

    题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5646 bc:http://bestcoder.hdu.edu.cn/contests/con ...

  9. DP Codeforces Round #FF (Div. 1) A. DZY Loves Sequences

    题目传送门 /* DP:先用l,r数组记录前缀后缀上升长度,最大值会在三种情况中产生: 1. a[i-1] + 1 < a[i+1],可以改a[i],那么值为l[i-1] + r[i+1] + ...

随机推荐

  1. 观【史上最牛linux视频教程】整理笔记,持续更新……

    //文件处理命令 命令格式:命令 [-参数] [参数] 例:ls -la /etc -a等于--all //目录处理命令:ls 英文原意:list 所在路径:/bin/ls 语法:ls 选项[-ald ...

  2. PHP递归

    <?php /** * Mr.xml * 处理无限级分类 */ class Category{ /** * [递归一维数组] * @param [type] $cate [传递一个数组$cate ...

  3. H5 APP开发必读,20个你不知道的Html5新特征和窍门

    Jeffrey Way曾发表过一篇博文<28 HTML5 Features, Tips, and Techniques you Must Know >讲述了28个HTML5特征.窍门和技术 ...

  4. jquery div拖动效果示例代码

    div拖动效果想必大家都有见到过吧,实现的方法也是有很多的,下面为大家将介绍使用jquery是如何实现的,感兴趣的朋友不要错过 复制代码代码如下: <%@ page language=" ...

  5. MVC+EF 随笔小计————Html Helpers

    理论基础 -- Html Helpers 主要分成输入类和显示类. 输入类: TextArea, TextBox Password Hidden DropDownList ListBox (与Drop ...

  6. navigationController Pop回指定页面

    [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIn ...

  7. IDEA的使用

    1.设置字体file->setting->color$fonts->font 保存提示设置file->Settings -> Editor -> General - ...

  8. CoreText实现图文混排之点击事件-b

    CoreText实现图文混排之点击事件 主要思路 我们知道,CoreText是基于UIView去绘制的,那么既然有UIView,就有 -(void)touchesBegan:(NSSet<UIT ...

  9. win2003 sp2+iis 6.0上部署.net 2.0和.net 4.0网站的方法

    网站环境 IIS6.0,操作系统Windows server2003 sp2,服务器之前已经部署了.net 2.0和asp的网站,现在要部署新开发的.net 4.0网站.本来认为很简单,却遇到了很多问 ...

  10. java JNI 调试出现的错误

    java JNI 调试出现的错误 ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2JDW ...