【HDU 5647】DZY Loves Connecting(树DP)
pid=5647">【HDU 5647】DZY Loves Connecting(树DP)
DZY Loves Connecting
Total Submission(s): 332 Accepted Submission(s): 112
n
nodes labeled from 1
to n.
DZY likes connected sets on the tree. A connected set
S
is a set of nodes, such that every two nodes u,v
in S
can be connected by a path on the tree, and the path should only contain nodes from
S.
Obviously, a set consisting of a single node is also considered a connected set.
The size of a connected set is defined by the number of nodes which it contains. DZY wants to know the sum of the sizes of all the connected sets. Can you help him count it?
The answer may be large. Please output modulo 109+7.
denoting the number of testcases.
t
testcases follow. In each testcase, first line contains
n.
In lines 2∼n,
ith
line contains pi,
meaning there is an edge between node i
and node pi.
(1≤pi≤i−1,2≤i≤n)
(n≥1。
sum of n
in all testcases does not exceed 200000)
109+7.
2
1
5
1
2
2
3
1
42HintIn the second sample, the 4 edges are (1,2),(2,3),(2,4),(3,5). All the connected sets are {1},{2},{3},{4},{5},{1,2},{2,3},{2,4},{3,5},{1,2,3},{1,2,4},{2,3,4},{2,3,5},{1,2,3,4},{1,2,3,5},{2,3,4,5},{1,2,3,4,5}. If you need a larger stack size,
please use #pragma comment(linker, "/STACK:102400000,102400000") and submit your solution using C++.
一个挺直接的树DP。之前TC的一个原题,。比赛时死活没啃出来。。
。太嫩了……
题目大意:给出一个树,详细建法就不细说了。每一个点贡献为1,问树上全部不同集合的合计贡献。
首先对于每一个点,我们能够求出它所在的集合数量。
开个数组cnt。表示第i个点在其子树中所在的集合数。这样cnt[i]就等于i全部孩子的cnt+1的乘积。事实上这里用到了组合,从全部孩子中能够随意选择一定的集合(+1表示空集)进行组合。
求出集合数是为了求贡献,遍历到i的某个孩子的时候,新添加的贡献事实上就是之前的全部贡献乘上该孩子的集合数+1(选择某些集合组合),然后对于之前遍历的子数。该孩子也能够提供贡献,也就是该孩子的贡献乘上当前出现的集合数。
口述表达的不好,也不会做那种图。
。还是看代码吧,就俩公式。。
代码例如以下:
#include <iostream>
#include <cmath>
#include <vector>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <queue>
#include <stack>
#include <list>
#include <algorithm>
#include <map>
#include <set>
#define LL long long
#define Pr pair<int,int>
#define fread() freopen("in.in","r",stdin)
#define fwrite() freopen("out.out","w",stdout) using namespace std;
const int INF = 0x3f3f3f3f;
const int msz = 10000;
const int mod = 1e9+7;
const double eps = 1e-8; struct Edge
{
int v,next;
}; Edge eg[233333];
int head[233333];
//0存当前节点往下包括当前节点的区间数 1存当前节点的子树中全部包括当前节点的贡献
LL dp[233333][2];
LL ans; void dfs(int u)
{
dp[u][1] = 1;
dp[u][0] = 1;
for(int i = head[u]; i != -1; i = eg[i].next)
{
dfs(eg[i].v);
//当前点子树中包括当前点的区间的贡献
dp[u][1] = (dp[u][1]*(dp[eg[i].v][0]+1)+dp[eg[i].v][1]*dp[u][0])%mod;
dp[u][0] = (dp[u][0]*(dp[eg[i].v][0]+1))%mod;
}
ans = (ans+dp[u][1])%mod;
} int main()
{
//fread();
//fwrite(); int x,t,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
memset(head,-1,sizeof(head));
for(int i = 2; i <= n; ++i)
{
scanf("%d",&x);
eg[i].v = i;
eg[i].next = head[x];
head[x] = i;
}
ans = 0;
dfs(1);
printf("%lld\n",ans);
} return 0;
}
【HDU 5647】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 ...
- HDU5647 DZY Loves Connecting 树形DP
(先奉上jcvb大神的官方题解)BC 76 div 1 1002 对于每个结点i,统计出f[i]表示包含i的连通集有多少个,那么容易看出答案就是所有f[i]的和. 要计算f[i]是经典的树形DP问题. ...
- HDU 5646 DZY Loves Partition
题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5646 bc:http://bestcoder.hdu.edu.cn/contests/con ...
- Hdu 5274 Dylans loves tree (树链剖分模板)
Hdu 5274 Dylans loves tree (树链剖分模板) 题目传送门 #include <queue> #include <cmath> #include < ...
- hdu 5195 DZY Loves Topological Sorting 线段树+拓扑排序
DZY Loves Topological Sorting Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/sho ...
- hdu 5195 DZY Loves Topological Sorting BestCoder Round #35 1002 [ 拓扑排序 + 优先队列 || 线段树 ]
传送门 DZY Loves Topological Sorting Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131 ...
- hdu 5195 DZY Loves Topological Sorting (拓扑排序+线段树)
DZY Loves Topological Sorting Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 ...
- HDU 5649.DZY Loves Sorting-线段树+二分-当前第k个位置的数
DZY Loves Sorting Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Oth ...
- 数据结构(线段树):HDU 5649 DZY Loves Sorting
DZY Loves Sorting Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Oth ...
随机推荐
- Web安全测试漏洞场景
HTTP.sys 远程代码执行 测试类型: 基础结构测试 威胁分类: 操作系统命令 原因: 未安装第三方产品的最新补丁或最新修订程序 安全性风险: 可能会在 Web 服务器上运行远程命 ...
- Unity Shader _Time 的单位
名称 类型 说明 _Time float4 t 是自该场景加载开始所经过的时间,4个分量分别是 (t/20, t, t*2, t*3) _SinTime float4 t 是时间的正弦值,4个分量分别 ...
- mysql中文显示问号,不能识别中文的解决方案
到后台mysql中查看是问号. 并不能显示出中文,初步判定是编码的问题. 我们利用 show variables like'character_set_%'; 与 show variables lik ...
- POI Excel表格合并,边框设置
RegionUtil.setBorderLeft(1, cellRangeAddress, sheet, wb); RegionUtil.setBorderBottom(1, cellRangeAdd ...
- [转]Sphinx+Mysql+中文分词安装-实现中文全文搜索
From : http://blog.csdn.net/lgm252008/article/details/5373436 1.什么是SphinxSphinx 是一个在GPLv2 下发布的一个全文检索 ...
- swift3.0:sqlite3的使用
介绍 一.sqlite是纯C语言中底层的数据库,在OC和Swift中都是经常使用的数据库,在开发中,可以使用代码创建数据库,可以使用图形化界面创建数据库.例如SQLiteManager.SQLiteS ...
- CF 329B(Biridian Forest-贪心-非二分)
B. Biridian Forest time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- ENC28J60学习笔记——第1部分
1前言 嵌入式以太网开发,可以分为两个部分,一个是以太网收发芯片的使用,一个是嵌入式以太网协议栈的实现.以太网收发芯片的使用要比串口收发芯片的使用复杂的多,市面上流通比较广泛的以太网收发芯片种类还不少 ...
- query多选下拉框插件 jquery-multiselect(修改)
其实网上关于该控件的使用教程已经很多了,其中 query多选下拉框插件 jquery-multiselect Jquery多选下拉列表插件jquery multiselect功能介绍及使用 这2个的介 ...
- 如何修改Windows上某块网卡的MTU的值
先用如下命令查看所有的网卡以及他们的MTU的值. netsh interface ipv4 show interfaces 使用如下的命令修改他们的MTU为9000. netsh int ...