传送门
题意:
给定一棵树,起初树边都是坏边,对于以节点ii为起点,你需要把一些坏边改成好边,使得从ii出发到达其他节点的路径上至多只有一条坏边,求每个节点ii的方案数
思路:
学习了一些新姿势
reflash:这是很简单的树形dp思想
转移还是挺好想的,用f[i]f[i]表示从ii出发到达其子树的方案数,g[i]g[i]表示从i出发到达其祖先及兄弟的方案数,然后直接转移就可以了
一开始我有点zz,分状态f/g[i][0/1]f/g[i][0/1]
然后就写出来如下转移
f[i][0]=∏v是i的子节点f[v][0]f[i][0]=\prod_{v是i的子节点} f[v][0]
f[i][1]=∏v是i的子节点(f[v][1]+f[v][0])       i不是根节点f[i][1]=\prod_{v是i的子节点} (f[v][1]+f[v][0])\ \ \ \ \ \ \ i不是根节点
f[i][1]=∏v是i的子节点(f[v][1]+f[v][0])−∏v是i的子节点f[v][0]       i是根节点f[i][1]=\prod_{v是i的子节点} (f[v][1]+f[v][0])-\prod_{v是i的子节点} f[v][0]\ \ \ \ \ \ \ i是根节点
后来发现f[i][0]f[i][0]不都是1吗!
g[i][0]g[i][0]同理
然后就改成了这个样子

f[i]=∏v是i的子节点(f[v]+1)

f[i]=\prod_{v是i的子节点} (f[v]+1)

g[i]=g[fa[i]]∗∏v是fa[i]的子节点且v!=if[i]

g[i]=g[fa[i]]*\prod_{v是fa[i]的子节点且v!=i}f[i]
或者是这个样子

g[i]=g[fa[i]]∗f[fa[i]]f[i]+1

g[i]=g[fa[i]]*\frac {f[fa[i]]}{f[i]+1}
在模意义当然要搞 f[i]+1f[i]+1的逆元了
欢天喜地交上去WA了……

思考了一会,发现当 f[i]+1f[i]+1正好是模数 109+710^9+7没法弄,因为没法还原出来 ∏v是fa[i]的子节点且v!=if[i]\prod_{v是fa[i]的子节点且v!=i}f[i]
那怎么办?
官方题解给出的做法好像是记录前缀积和后缀积,其实我们还有一种思路
我们可以考虑一下,对于一个节点 ii而言,如果没有子节点vv满足 f[v]+1f[v]+1是模数的情况,那么求逆元的做法是很科学的
那如果有一个 f[v]+1f[v]+1是模数呢?
我们可以特地开一个数组记录下来其他子节点的乘积,然后在对 g[i]g[i]转移时特判一下就好了
如果有两个以上呢?
实际上与只有一个的情况是一样的,因为不管怎么转移都是 00啦
复杂度O(nlogP)O(n \log P)
代码:

#include<cstdio>
#include<iostream>
#define M 200005
#define LL long long
#define mo 1000000007
using namespace std;
int n,tot,cnt;
int first[M],f[M],g[M],T[M];
bool vis[M];
struct edge{int v,next;
}e[M<<1];
int in()
{int t=0;char ch=getchar();while (ch>'9'||ch<'0') ch=getchar();while (ch>='0'&&ch<='9') t=(t<<1)+(t<<3)+ch-48,ch=getchar();return t;
}
void add(int x,int y)
{e[++tot].v=y;e[tot].next=first[x];first[x]=tot;e[++tot].v=x;e[tot].next=first[y];first[y]=tot;
}
int inv(int x)
{int y=mo-2,t=1;for (;y;y>>=1,x=(LL)x*x%mo)if (y&1) t=(LL)t*x%mo;return t;
}
void dfs(int x,int fa)
{f[x]=1;bool flag=0;for (int i=first[x];i;i=e[i].next)if (e[i].v!=fa){dfs(e[i].v,x);if (f[e[i].v]+1==mo&&!flag)vis[e[i].v]=1,flag=1;elsef[x]=1LL*f[x]*(f[e[i].v]+1)%mo;}if (flag) T[x]=f[x],f[x]=0;
}
void dfs2(int x,int fa)
{++g[x];for (int i=first[x];i;i=e[i].next)if (e[i].v!=fa){if (!vis[e[i].v])g[e[i].v]=1LL*g[x]*f[x]%mo*inv(f[e[i].v]+1)%mo;elseg[e[i].v]=1LL*g[x]*T[x]%mo;dfs2(e[i].v,x);}
}
main()
{n=in();for (int i=2;i<=n;++i) add(i,in());dfs(1,0);dfs2(1,0);  for (int i=1;i<=n;++i) printf("%d ",1LL*g[i]*f[i]%mo);
}

【CF 543D】Road Improvement,树形DP相关推荐

  1. CF 1625C. Road Optimization(DP)

    Linking 题意: 在一条直线道路从A到走向B点,A点位于0位置,B点位于m位置. 道路上有n个时速牌,第i个牌上标有ai,表示从该时速牌到下一时速牌这段距离中,每走一个位置耗时ai分钟.(初始位 ...

  2. cf 1060e 树形dp 树上任意两点的距离和

    题意: 给出一个树,把树上任意两个相隔一个点的点加一条边,问加完边之后任意两点的距离和是多少.   参考博客 :https://blog.csdn.net/Mr_Treeeee/article/det ...

  3. *【HDU - 6201】transaction transaction transaction(树形dp 或 spfa最长路 或 网络流)

    题干: 题目大意: 给出一棵n个顶点的树,每个点有一个权值,代表商品的售价,树上每一条边上也有一个权值,代表从这条边经过所需要的花费.现在需要你在树上选择两个点,一个作为买入商品的点,一个作为卖出商品 ...

  4. 【CodeForces - 1084D】The Fair Nut and the Best Path (树形dp)

    题干: The Fair Nut is going to travel to the Tree Country, in which there are nn cities. Most of the l ...

  5. 动态规划报告(树形DP+概率DP

    动态规划报告 树形dp 树形 DP,即在树上进行的 DP.由于树固有的递归性质,树形 DP 一般都是递归进行的.一般需要在遍历树的同时维护所需的信息 以一道题目为例 2022CCPC桂林站G Grou ...

  6. CodeForces 1084D The Fair Nut and the Best Path(树形dp)

    题目描述 The Fair Nut is going to travel to the Tree Country, in which there are n cities. Most of the l ...

  7. BNUOJ 52305 Around the World 树形dp

    题目链接: https://www.bnuoj.com/v3/problem_show.php?pid=52305 Around the World Time Limit: 20000msMemory ...

  8. [树形dp] Jzoj P5233 概率博弈

    Description 小A和小B在玩游戏.这个游戏是这样的: 有一棵n个点的以1为根的有根树,叶子有权值.假设有m个叶子,那么树上每个叶子的权值序列就是一个1->m 的排列. 一开始在1号点有 ...

  9. fwt优化+树形DP HDU 5909

    1 //fwt优化+树形DP HDU 5909 2 //见官方题解 3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/ 4 5 #include ...

最新文章

  1. iOS一些实用的技巧
  2. Theme.NoTitleBar问题
  3. OpenGL中投影变换矩阵的反向推导
  4. windows下自制动画层引擎 - 放两个demo
  5. ITK:矢量图像上的邻域迭代器
  6. SD/MMC相关寄存器的介绍
  7. java中同步锁的原理和实现
  8. 小程序向webview传参_独家 | 支付宝小程序向个人开发者开放公测
  9. C/C++常见问题(转)
  10. python自动化测试框架开发_webUI自动化测试框架(Python+selenium)
  11. 拓端tecdat|R语言回归中的Hosmer-Lemeshow拟合优度检验
  12. Grammarly SCI语法检查总结
  13. ZK 数据传输三:在页面使用SpringUtil获取spring层类再获取数据(jsp页面或zul页面)...
  14. python暴力破解wps,Word,excel等文件
  15. 中华石杉-- --搜索引擎的笔记
  16. canvas文字粒子动画js特效
  17. 郑州java工程师待遇怎么样_Java工程师工资待遇怎么样?
  18. 天龙八部手游服务器维护公告,天龙八部手游 近期更新维护公告
  19. Hyper 虚拟机删掉,如何恢复
  20. 走近澳洲------个人所得税篇

热门文章

  1. 【LiteOS】STM32F103-LiteOS移植教程(详细篇)
  2. 基于CSE的微服务架构实践-Spring Boot技术栈选型
  3. NVDLA软件架构和源码解析 第一章—内核驱动
  4. 某学校有计算机主机1300台,网络互联技术与实践第14章:构建基于静态路由的多层网络.ppt...
  5. 织梦熊掌号提交urls.php,织梦熊掌号api自动提交代码
  6. 计算机图形学E1——OpenGL 方中有圆,圆中有方,无穷尽焉
  7. centos6 进入命令行_CentOS6.8设置开机直接进入命令行模式
  8. ubuntu 14.10 64bit系统安装MBuntu主题(仿Mac主题)
  9. GitHub的常用命令---终端操作
  10. Nodejs服务器端处理POST提交的数据_note