HDU5647 DZY Loves Connecting 树形DP
(先奉上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的更多相关文章
- HDU 5647 DZY Loves Connecting 树形dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5647 题解: 令dp[u][0]表示u所在的子树中所有的包含i的集合数,设u的儿子为vi,则易知dp ...
- 【HDU 5647】DZY Loves Connecting(树DP)
pid=5647">[HDU 5647]DZY Loves Connecting(树DP) DZY Loves Connecting Time Limit: 4000/2000 MS ...
- codeforces#FF DIV2C题DZY Loves Sequences(DP)
题目地址:http://codeforces.com/contest/447/problem/C C. DZY Loves Sequences time limit per test 1 second ...
- 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 ...
- Codeforces 447 C DZY Loves Sequences【DP】
题意:给出一列数,在这个序列里面找到一个连续的严格上升的子串,现在可以任意修改序列里面的一个数,问得到的子串最长是多少 看的题解,自己没有想出来 假设修改的是a[i],那么有三种情况, 1.a[i]& ...
- Codeforces 446A. DZY Loves Sequences (线性DP)
<题目链接> 题目大意: 给定一个长度为$n$的序列,现在最多能够改变其中的一个数字,使其变成任意值.问你这个序列的最长严格上升子段的长度是多少. #include <bits/st ...
- CodeForces - 446A DZY Loves Sequences(dp)
题意:给定一个序列a,求最长的连续子序列b的长度,在至多修改b内一个数字(可修改为任何数字)的条件下,使得b严格递增. 分析: 1.因为至多修改一个数字,假设修改a[i], 2.若能使a[i] < ...
- HDU 5646 DZY Loves Partition
题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5646 bc:http://bestcoder.hdu.edu.cn/contests/con ...
- 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] + ...
随机推荐
- ViewState压缩
/// <summary> ///CompressViewState 的摘要说明 /// </summary> public class CompressViewState:S ...
- json 数字key json 数字作为主键
但是当key的值为数字时,只能使用类似数组下表的访问方式取值. var json = '{"0":"a", "1":"b" ...
- secureCRT简单上传、下载文件记录
secureCRT简单上传.下载文件记录: 1)sz下载 -y 覆盖 2)rz上传 -y 覆盖 3)以上两个命令属于安装时包含在“Dial-up Networking Support"组中 ...
- 制作按钮(Button)
按钮的核心作用 1.按钮能接收单击并触发响应事件. 2.按钮被单击时能同时触发多个响应事件. 3.按钮可以有普通.悬停.单击.禁用等多个状态的不同表现. 4.广泛的说,按钮的核心在于接收事件,任何可以 ...
- Statusbar出现透明及界面下方出现空白
步骤1.在ViewController中 loadView #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 if ( IOS7_OR_LATER ) ...
- 通过xib文件创建和连接UIView
使用Xcode写程序,时间长了,对于界面上的元素,很多时候不想手写代码进行构建,但是有些UIView里面的子控件,又不能通过xib直接进行构造,要是总使用UIViewController来结合xib进 ...
- JDBC之PreparedStatement模糊查询
今天要做一个关于模糊查询的需求,以前用JDBC做精确查询都是用 "SELECT * FROM test WHERE id = ?",所以用模糊查询时理所当然的也用了"SE ...
- BZOJ 3955 Surely You Congest 解题报告
首先,我们可以求出源为 $1$ 号点的最短路图以及各个点到 $1$ 号点的最短路. 然后我们考虑那些距离不同的点,是一定不会发生拥堵现象的. 然后我们就只需要考虑那些距离相同的点,就相当于做一个最大流 ...
- 关于PIL库的一些概念
关于PIL库的一些概念 pil能处理的图片类型pil可以处理光栅图片(像素数据组成的的块). 通道一个图片可以包含一到多个数据通道,如果这些通道具有相同的维数和深度,Pil允许将这些通道进行叠加 模式 ...
- php获取请求的方式(get/post)
$request_method = $_SERVER['REQUEST_METHOD'];//用什么方式访问 get post