感觉很多树上难以直接求解的问题都可以转化为动态规划问题并进行求解$.$
令 $f[x],g[x]$ 分别表示以 $x$ 为根的子树不想上延申,向上延申的方案数$.$
这里向上延申指的是会有其他子树的节点与该点子树中某个点颜色相同并进行配对$.$
考虑转移:
$f[x]=g[x]=\prod_{v\in son[x]} (f[v]+g[v]).$
然而,我们还要减掉一些不合法的.
令 $v'$ 表示我们当前枚举到的儿子.
先考虑 $f[x]:$
首先,$x$ 儿子中不可能只有一个延申:$f[x]$ 已经表示在 $x$ 终止了,而只有一个延申的话不能在 $x$ 终止.
所以,$f[x]=\prod_{v\in son[x]} (f[v]+g[v])-\frac{\prod_{v\in son[x]}f[v]}{f[v']}\times g[v'].$
而 $g[x]$ 中不能出现一个都不延申的情况,即 $g[x]=\prod_{v\in son[x]} (f[v]+g[v])-\prod_{v\in son[x]}f[v].$

#include <cstdio>
#include <algorithm>
#define N 200005
#define mod 998244353
#define ll long long
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
ll qpow(ll base,ll k)
{
ll tmp=1;
for(;k;base=base*base%mod,k>>=1) if(k&1) tmp=tmp*base%mod;
return tmp;
}
ll inv(ll k)
{
return qpow(k,mod-2);
}
int n,edges;
ll f[N],g[N];
int hd[N],to[N],nex[N],size[N];
void add(int u,int v)
{
nex[++edges]=hd[u],hd[u]=edges,to[edges]=v;
}
void dfs(int u)
{
int i;
size[u]=1;
ll sum=1;
f[u]=g[u]=1;
for(i=hd[u];i;i=nex[i])
{
int v=to[i];
dfs(v);
size[u]+=size[v];
sum=sum*f[v]%mod;
f[u]=f[u]*((f[v]+g[v])%mod)%mod;
}
g[u]=f[u];
if(size[u]>1)
{
g[u]=(g[u]+mod-sum)%mod;
for(i=hd[u];i;i=nex[i])
{
int v=to[i];
ll tmp=inv(f[v])*g[v]%mod;
tmp=tmp*sum%mod;
f[u]=(f[u]+mod-tmp)%mod;
}
}
}
int main()
{
int i,j;
// setIO("input");
scanf("%d",&n);
for(i=2;i<=n;++i)
{
int a;
scanf("%d",&a),add(a,i);
}
dfs(1);
printf("%lld\n",f[1]);
return 0;
}

  

CF1146F Leaf Partition 树形DP的更多相关文章

  1. HDU 5682 zxa and leaf 二分 树形dp

    zxa and leaf 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5682 Description zxa have an unrooted t ...

  2. 洛谷P4438 道路 [HNOI/AHOI2018] 树形dp

    正解:树形dp 解题报告: 传送门! 昂首先看懂题目趴QwQ大概就是说有棵满二叉树,有n个叶子节点(乡村)和n-1个非叶子节点,然后这棵树的每个节点有三个属性abc,对每个非叶子节点可以从与子节点的两 ...

  3. [JLOI2015]战争调度【暴力+树形Dp】

    Online Judge:Bzoj4007,Luogu P3262 Label:暴力,树形Dp 题解 参考了这篇blog https://www.cnblogs.com/GXZlegend/p/830 ...

  4. [CQOI2009]叶子的染色【性质+树形Dp】

    Online Judge:Bzoj1304,Luogu P3155 Label:无根树,树形Dp 题目描述 给定一棵\(N\)个节点的无根树,它一共有\(K\)个叶子节点.你可以选择一个度数大于1的节 ...

  5. poj3417 LCA + 树形dp

    Network Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4478   Accepted: 1292 Descripti ...

  6. COGS 2532. [HZOI 2016]树之美 树形dp

    可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...

  7. 【BZOJ-4726】Sabota? 树形DP

    4726: [POI2017]Sabota? Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 128  Solved ...

  8. 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)

    题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...

  9. 树形DP

    切题ing!!!!! HDU  2196 Anniversary party 经典树形DP,以前写的太搓了,终于学会简单写法了.... #include <iostream> #inclu ...

随机推荐

  1. php 数组相关方法的一些实际妙用

    一.php数组合并两个数组(一个数组做键名,另一个做值) 有两个方法 1.循环 $arry_a = array(0, 1, 2); $arry_b = array('dongsir','董先生','董 ...

  2. sp_addlinkedserver 跨服务器连接数据库查询

    ----创建远程链接服务器--exec sys.sp_addlinkedserver --@server='LMS',--被访问的服务器别名--@srvproduct='',--@provider=' ...

  3. ubuntu14.04 x86编译upx 3.92 及so加固

    的参考文章: http://www.cnblogs.com/fishou/p/4202061.html 1.download upx和所依赖的组件 upx3.:https://www.pysol.or ...

  4. qq快捷打开聊天窗口的代码

    pc代码: http://wpa.qq.com/msgrd?v=3&uin=8423291&site=qq&menu=yes

  5. Groovy--使用模板引擎和GroovyShell执行插值字符串

    package curveJudge import groovy.text.SimpleTemplateEngine /** * Created by Jxy on 2019/8/26 17:16 * ...

  6. ONNX源码安装

    ONNX是facebook提出的一个 Open Neural Network Exchange协议,能够让训练好的模型在不同的框架间进行交互. ONNX的安装相对来说不是特别麻烦,麻烦的是其依赖库的安 ...

  7. Centos7下查看端口占用

    netstat -nap #会列出所有正在使用的端口及关联的进程/应用 netstat -lnp|grep 5000 这条语句的作用是查询占用5000端口的应用和进程,把5000端口替换成你要过滤的端 ...

  8. Oracle12cCDB和PDB数据库的启动与关闭说明

    在Oracle 12c中,分CDB 和PDB,他们的启动和关闭操作整理如下. 1 Container Database (CDB) 对于CDB,启动和关闭与之前传统的方式一样,具体语法如下: STAR ...

  9. Ansible简单介绍(一)

    一 :ansible简单介绍 此名取自 Ansible 作者最喜爱的<安德的游戏> 小说,而这部小说更被后人改编成电影 -<战争游戏>. 官网地址:https://www.an ...

  10. C++ 新特性 笔记 2 右值引用

    C ++ Rvalue引用说明 以下内容,主要是上述链接的摘要 介绍 Rvalue引用是C ++的一个特性,它是随C ++ 11标准添加的.使右值参考有点难以理解的是,当你第一次看到它们时,不清楚它们 ...