【CF 543D】Road Improvement,树形DP
传送门
题意:
给定一棵树,起初树边都是坏边,对于以节点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]=\prod_{v是i的子节点} (f[v]+1)
g[i]=g[fa[i]]*\prod_{v是fa[i]的子节点且v!=i}f[i]
或者是这个样子
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相关推荐
- CF 1625C. Road Optimization(DP)
Linking 题意: 在一条直线道路从A到走向B点,A点位于0位置,B点位于m位置. 道路上有n个时速牌,第i个牌上标有ai,表示从该时速牌到下一时速牌这段距离中,每走一个位置耗时ai分钟.(初始位 ...
- cf 1060e 树形dp 树上任意两点的距离和
题意: 给出一个树,把树上任意两个相隔一个点的点加一条边,问加完边之后任意两点的距离和是多少. 参考博客 :https://blog.csdn.net/Mr_Treeeee/article/det ...
- *【HDU - 6201】transaction transaction transaction(树形dp 或 spfa最长路 或 网络流)
题干: 题目大意: 给出一棵n个顶点的树,每个点有一个权值,代表商品的售价,树上每一条边上也有一个权值,代表从这条边经过所需要的花费.现在需要你在树上选择两个点,一个作为买入商品的点,一个作为卖出商品 ...
- 【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 ...
- 动态规划报告(树形DP+概率DP
动态规划报告 树形dp 树形 DP,即在树上进行的 DP.由于树固有的递归性质,树形 DP 一般都是递归进行的.一般需要在遍历树的同时维护所需的信息 以一道题目为例 2022CCPC桂林站G Grou ...
- 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 ...
- BNUOJ 52305 Around the World 树形dp
题目链接: https://www.bnuoj.com/v3/problem_show.php?pid=52305 Around the World Time Limit: 20000msMemory ...
- [树形dp] Jzoj P5233 概率博弈
Description 小A和小B在玩游戏.这个游戏是这样的: 有一棵n个点的以1为根的有根树,叶子有权值.假设有m个叶子,那么树上每个叶子的权值序列就是一个1->m 的排列. 一开始在1号点有 ...
- fwt优化+树形DP HDU 5909
1 //fwt优化+树形DP HDU 5909 2 //见官方题解 3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/ 4 5 #include ...
最新文章
- iOS一些实用的技巧
- Theme.NoTitleBar问题
- OpenGL中投影变换矩阵的反向推导
- windows下自制动画层引擎 - 放两个demo
- ITK:矢量图像上的邻域迭代器
- SD/MMC相关寄存器的介绍
- java中同步锁的原理和实现
- 小程序向webview传参_独家 | 支付宝小程序向个人开发者开放公测
- C/C++常见问题(转)
- python自动化测试框架开发_webUI自动化测试框架(Python+selenium)
- 拓端tecdat|R语言回归中的Hosmer-Lemeshow拟合优度检验
- Grammarly SCI语法检查总结
- ZK 数据传输三:在页面使用SpringUtil获取spring层类再获取数据(jsp页面或zul页面)...
- python暴力破解wps,Word,excel等文件
- 中华石杉-- --搜索引擎的笔记
- canvas文字粒子动画js特效
- 郑州java工程师待遇怎么样_Java工程师工资待遇怎么样?
- 天龙八部手游服务器维护公告,天龙八部手游 近期更新维护公告
- Hyper 虚拟机删掉,如何恢复
- 走近澳洲------个人所得税篇
热门文章
- 【LiteOS】STM32F103-LiteOS移植教程(详细篇)
- 基于CSE的微服务架构实践-Spring Boot技术栈选型
- NVDLA软件架构和源码解析 第一章—内核驱动
- 某学校有计算机主机1300台,网络互联技术与实践第14章:构建基于静态路由的多层网络.ppt...
- 织梦熊掌号提交urls.php,织梦熊掌号api自动提交代码
- 计算机图形学E1——OpenGL 方中有圆,圆中有方,无穷尽焉
- centos6 进入命令行_CentOS6.8设置开机直接进入命令行模式
- ubuntu 14.10 64bit系统安装MBuntu主题(仿Mac主题)
- GitHub的常用命令---终端操作
- Nodejs服务器端处理POST提交的数据_note