fzyzojP2291 -- 小添添的庄园之道路修复


直接换根dp
f[i]表示,i为根的子树的方案
f[i]=Π(f[son]+1)(就是考虑这个边修不修(不修,子树中只有一种方案))
这里是乘法
换根的时候,直接算的话,为了消除x对fa的贡献,要乘上逆元
但是
1.会TLE
2.可能f[x]+1=1e9+7,也就是没有逆元(除以0是非法的)
所以考虑用x前面的兄弟的答案和后面兄弟答案(两个连乘积)拼凑
(不用每个点开一个vector记录儿子,直接每个x开一个数记录关于father的前后兄弟答案即可)
换根的时候,把fa的贡献随便作为x儿子y的前面兄弟或者后面兄弟即可
代码:
#include<bits/stdc++.h>
#define il inline
#define reg register int
#define numb (ch^'0')
#define int long long
using namespace std;
typedef long long ll;
il void rd(int &x){
char ch;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
namespace Miracle{
const int N=1e6+;
const int mod=1e9+;
int n;
struct node{
int nxt,to;
}e[*N];
int hd[N],cnt;
void add(int x,int y){
e[++cnt].nxt=hd[x];
e[cnt].to=y;
hd[x]=cnt;
}
int f[N];
int ple[N],pri[N];
int ans[N];
int mo(int x){
//return x>=mod?x-mod:x;
return x%mod;
}
int sta[N],top;
void dfs(int x,int fa){
f[x]=;
int st=top;
ll tmp=;
ple[x]=;
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
if(y==fa) continue;
dfs(y,x);
sta[++top]=y;
ple[y]=f[x];
f[x]=(ll)f[x]*(f[y]+)%mod;
}
pri[x]=;
for(reg i=top;i>=st+;--i){
pri[sta[i]]=tmp;
tmp=(ll)tmp*(f[sta[i]]+)%mod;
}
top=st;
}
void sol(int x,int fa){
if(x!=){
ll nle=;
//cout<<" x "<<x<<" : "<<f[x]<<" ple "<<ple[x]<<" pri "<<pri[x]<<endl;
f[x]=(ll)f[x]*((ll)ple[x]*pri[x]%mod+)%mod;
ans[x]=f[x];
nle=((ll)ple[x]*pri[x]%mod+)%mod;
//cout<<" x "<<x<<" : "<<nle<<endl;
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
if(y==fa) continue;
ple[y]=(ll)ple[y]*nle%mod;
sol(y,x);
}
}
else{
ll nle=;
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
if(y==fa) continue;
sol(y,x);
}
}
}
int main(){
rd(n);
int y;
for(reg i=;i<=n;++i){
rd(y);add(i,y);add(y,i);
}
dfs(,);
ans[]=f[];
sol(,);
for(reg i=;i<=n;++i){
printf("%lld ",ans[i]);
}
return ;
} }
signed main(){
freopen("2.in","r",stdin);
freopen("2.out","w",stdout);
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2019/2/9 10:35:35
*/
换根的时候往往可能会除以0
要警惕!
前后兄弟处理无疑是最好的方法。
fzyzojP2291 -- 小添添的庄园之道路修复的更多相关文章
- 个人博客作业-week5-敏捷开发方法读后感
满篇英文对一个非单词狂魔来说真的是很吃力啊… 敏捷软件开发方法是一种从1990年代开始逐渐引起广发关注的一些新型软件开发方法,是一种应对快速变化的需求的一种软件开发能力,他们的具体名称.理念.过程.术 ...
- 【干货分享】大话团队的GIT分支策略进化史
封面 作为一名85后的技术男,一转眼10年过去了(一不小心暴露了年龄,虽然我叫18岁fantasy),亲手写代码已经是5年前了,目前主要负责公司的软件产品的规划和设计(所以最近写的东西也主要与设计和产 ...
- 【软件工程】Word frequency program
一.开始写代码前的规划: 1.尝试用C#来写,之前没有学过C#,对于C++也不熟,所以打算先花1天的时间学习C# 2.整个程序基本分为文件遍历.单词提取.单词匹配.排序.输出几个模块,各个模块大致时间 ...
- Spring boot参考指南
介绍 转载自:https://www.gitbook.com/book/qbgbook/spring-boot-reference-guide-zh/details 带目录浏览地址:http://ww ...
- 汉诺塔(思维、DP思想)
链接:https://ac.nowcoder.com/acm/contest/3007/C来源:牛客网 题目描述 现在你有 N 块矩形木板,第 i 块木板的尺寸是 Xi*Yi,你想用这些木板来玩汉诺塔 ...
- Diary -「NOI 2021」酱油记
雨幕浓稠 远近一白 是水雾弥漫的天 还是泡沫撑起的海 雨真大呢. 前几天去 ZH 中学集训没啥好记的,就从会合日开始叭. [Day -1] 逃出 ZH,掉入梦麟.( 高中的同学们忘记带 ...
- OO第二次博客作业—17373247
OO第二次博客作业 零.写在前面 OO第二单元宣告结束,在这个单元里自己算是真正对面向对象编程产生了比较深刻的理解,也认识到了一个合理的架构为编程带来的极大的便利. (挂三次评测分数 看出得分接近等差 ...
- [蓝点zigBee] CC2530 实用教程总览
Zstack 单个模块实验(无数据通信) 1Zstack精简,增加串口数据 Zstack 里面工程较多,整体代码量很大,若入门只需要先之关注其中的一个工程,在这个工程里添添补补逐步学习. 这一节主要是 ...
- 统计学习方法c++实现之八 EM算法与高斯混合模型
EM算法与高斯混合模型 前言 EM算法是一种用于含有隐变量的概率模型参数的极大似然估计的迭代算法.如果给定的概率模型的变量都是可观测变量,那么给定观测数据后,就可以根据极大似然估计来求出模型的参数,比 ...
随机推荐
- codeforces 1133E K Balanced Teams
题目链接:http://codeforces.com/contest/1133/problem/E 题目大意: 在n个人中找到k个队伍.每个队伍必须满足最大值减最小值不超过5.求满足条件k个队伍人数的 ...
- AtCoder | ARC102 | 瞎讲报告
目录 ARC102 前言 正文 传送链接~ ARC102 前言 实在是太菜了....写完第一题就弃疗..感觉T3好歹也是道可做题吧!!然后T2怎么又是进制拆分! 正文 A 题意 给你两个数字\(n,k ...
- telnet命令详解
基础命令学习目录 原文链接:https://www.cnblogs.com/PatrickLiu/p/8556762.html telnet命令用于登录远程主机,对远程主机进行管理.telnet因为采 ...
- Django之Form
目录 一.说明 二.参数说明 三.自定义验证规则 四.实例 一.说明 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数 ...
- jsweb常用代码
<script> $(function (){ $.ajax({ url: 'https://test.com:8080/api/v1/users?query_not_auth=100&a ...
- Daily Scrum (2015/10/31)
这几天我们组的进度有点慢,剩下这一周的我们必须要加油认真对待. 周末这两天我们是这样安排的: 成员 今日任务 时间 明日任务 符美潇 数据库部分代码的编写 1h 每周小组例会 潘礼鹏 团队博客作业 ...
- HDU 3092 Least common multiple 01背包
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3092 Least common multiple Time Limit: 2000/1000 MS ...
- vue之Mutations 理解
commit:提交可以在组件中使用 this.$store.commit('xxx') 提交 mutation,或者使用 mapMutations 辅助函数将组件中的 methods 映射为 stor ...
- HTML常用标签及约束
注释 <!--这是一段注释--> 样式表 外部样式(CSS) <head> <link rel="stylesheet" type="tex ...
- PAT 1053 住房空置率
https://pintia.cn/problem-sets/994805260223102976/problems/994805273284165632 在不打扰居民的前提下,统计住房空置率的一种方 ...