CF482D Random Function and Tree 树形DP + 思维 + 神题
挺神的一道树形 DP,特别不好写题解,有时间再补吧.
#include<bits/stdc++.h>
#define ull unsigned long long
#define MOD 1000000007
#define ll long long
#define maxn 120000
using namespace std;
void setIO(string s)
{
string in=s+".in";
string out=s+".out";
freopen(in.c_str(),"r",stdin);
// freopen(out.c_str(),"w",stdout);
}
vector<int>G[maxn];
ll F[maxn][2];
void solve(int n)
{
for(int u=n;u>=1;--u)
{
F[u][1]=1,F[u][0]=0;
int siz=G[u].size();
if(siz==0) continue;
for(int i=0;i<siz;++i)
{
int v=G[u][i];
ll a = ((F[u][0]*F[v][0])%MOD+(F[u][1]*F[v][1])%MOD)%MOD;
ll b = ((F[u][1]*F[v][0])%MOD+(F[u][0]*F[v][1])%MOD)%MOD;
F[u][0]=(F[u][0]+a)%MOD;
F[u][1]=(F[u][1]+b)%MOD;
}
F[u][0]=(F[u][0]*2ll)%MOD;
F[u][1]=(F[u][1]*2ll)%MOD;
ll p[3],tmp;
p[0]=p[1]=1, p[2]=0;
for(int i=0;i<siz;++i)
{
int v=G[u][i];
p[0]=((p[0]*F[v][0])%MOD+p[0])%MOD; // 全偶 (即左右走都一样)
tmp=p[2];
p[2]=((p[1]*F[v][1])%MOD+p[2])%MOD;
p[1]=((tmp*F[v][1])%MOD+p[1])%MOD;
}
F[u][1]=(F[u][1]-p[0]+MOD)%MOD;
F[u][0]=(F[u][0]-p[2]+MOD)%MOD;
}
}
int main()
{
// setIO("input");
int n;
scanf("%d",&n);
for(int i=2;i<=n;++i)
{
int p;
scanf("%d",&p);
G[p].push_back(i);
}
solve(n);
printf("%lld\n",(F[1][0]+F[1][1])%MOD);
return 0;
}
CF482D Random Function and Tree 树形DP + 思维 + 神题的更多相关文章
- 熟练剖分(tree) 树形DP
熟练剖分(tree) 树形DP 题目描述 题目传送门 分析 我们设\(f[i][j]\)为以\(i\)为根节点的子树中最坏时间复杂度小于等于\(j\)的概率 设\(g[i][j]\)为当前扫到的以\( ...
- 【DP_树形DP专题】题单总结
转载自 http://blog.csdn.net/woshi250hua/article/details/7644959#t2 题单:http://vjudge.net/contest/123963# ...
- hdu-5834 Magic boy Bi Luo with his excited tree(树形dp)
题目链接: Magic boy Bi Luo with his excited tree Time Limit: 8000/4000 MS (Java/Others) Memory Limit: ...
- CF 461B Appleman and Tree 树形DP
Appleman has a tree with n vertices. Some of the vertices (at least one) are colored black and other ...
- codeforces 161D Distance in Tree 树形dp
题目链接: http://codeforces.com/contest/161/problem/D D. Distance in Tree time limit per test 3 secondsm ...
- hdu6035 Colorful Tree 树形dp 给定一棵树,每个节点有一个颜色值。定义每条路径的值为经过的节点的不同颜色数。求所有路径的值和。
/** 题目:hdu6035 Colorful Tree 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6035 题意:给定一棵树,每个节点有一个颜色值.定 ...
- 5.10 省选模拟赛 tree 树形dp 逆元
LINK:tree 整场比赛看起来最不可做 确是最简单的题目. 感觉很难写 不过单独考虑某个点 容易想到树形dp的状态. 设f[x]表示以x为根的子树内有黑边的方案数. 白边方案只有一种所以不用记录. ...
- Codeforces Round #263 Div.1 B Appleman and Tree --树形DP【转】
题意:给了一棵树以及每个节点的颜色,1代表黑,0代表白,求将这棵树拆成k棵树,使得每棵树恰好有一个黑色节点的方法数 解法:树形DP问题.定义: dp[u][0]表示以u为根的子树对父亲的贡献为0 dp ...
- codeforces Round #263(div2) D. Appleman and Tree 树形dp
题意: 给出一棵树,每个节点都被标记了黑或白色,要求把这棵树的其中k条变切换,划分成k+1棵子树,每颗子树必须有1个黑色节点,求有多少种划分方法. 题解: 树形dp dp[x][0]表示是以x为根的树 ...
随机推荐
- FFmpeg基础库编程开发学习笔记——音频常见格式及字幕格式
声明一下:这些关于ffmpeg的文章仅仅是用于记录我的学习历程和以便于以后查阅,文章中的一些文字可能是直接摘自于其它文章.书籍或者文献,学习ffmpeg相关知识是为了使用在Android上,我也才是刚 ...
- android studio配置android开发环境
1.下载安装android-studio-bundle 地址:https://developer.android.com/sdk/index.html 注意:指定android sdk和android ...
- Resources.Theme
public final class Resources.Theme extends Object java.lang.Object ↳ android.content.res.Resource ...
- git 的安装和使用
安装Git 下载并安装 mysysgit 下载并安装 git windows版本号 配置Git 设置你的名字和邮箱 git config --global user.name "xxxx&q ...
- Building Maintainable Software-java篇之Couple Architecture Components Loosely
Building Maintainable Software-java篇之Couple Architecture Components Loosely There are two ways of co ...
- 君正Ingenic X1000E_halley2 更改Logo
有两种方法可以改变开机logo,编译进内核或者修改u-boot. <一>.编译进内核 一. 制作LOGO图片(可以使用gimp) 1. 制作一个.ppm格式图片(logo_tvu_clut ...
- Coursera Algorithms Programming Assignment 1: Percolation(100分)
题目来源http://coursera.cs.princeton.edu/algs4/assignments/percolation.html 作业分为两部分:建立模型和仿真实验. 最关键的部分就是建 ...
- 【贪心】小Y的炮[cannon]题解
模拟赛的题目,做的时候由于第二题表打太久了,只剩下40分钟,想都没想就写了一个爆搜20分... 这道题单调性很关键,下面会解释 P.S.解释在代码里 #include<cstdio> #i ...
- 7.union
联合结果集union 简单的结果集联合: select number,name,age from emp union select cardnumber,name,age from emp2 基本的原 ...
- 自学Python五 爬虫基础练习之SmartQQ协议
BAT站在中国互联网的顶端,引导着中国互联网的发展走向...既受到了多数程序员的关注,也在被我们所惦记着... 关于SmartQQ的协议来自HexBlog,根据他的博客我自己也一步一步的去分析,去尝试 ...