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*10+numb);
    (fl==true)&&(x=-x);
}
namespace Miracle{
const int N=1e6+6;
const int mod=1e9+7;
int n;
struct node{
    int nxt,to;
}e[2*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]=1;
    int st=top;
    ll tmp=1;
    ple[x]=1;
    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]+1)%mod;
    }
    pri[x]=1;
    for(reg i=top;i>=st+1;--i){
        pri[sta[i]]=tmp;
        tmp=(ll)tmp*(f[sta[i]]+1)%mod;
    }
    top=st;
}
void sol(int x,int fa){
    if(x!=1){
        ll nle=1;
        //cout<<" x "<<x<<" : "<<f[x]<<" ple "<<ple[x]<<" pri "<<pri[x]<<endl;
        f[x]=(ll)f[x]*((ll)ple[x]*pri[x]%mod+1)%mod;
        ans[x]=f[x];
        nle=((ll)ple[x]*pri[x]%mod+1)%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=1;
        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=2;i<=n;++i){
        rd(y);add(i,y);add(y,i);
    }
    dfs(1,0);
    ans[1]=f[1];
    sol(1,0);
    for(reg i=1;i<=n;++i){
        printf("%lld ",ans[i]);
    }
    return 0;
}

}
signed main(){
    freopen("2.in","r",stdin);
    freopen("2.out","w",stdout);
    Miracle::main();
    return 0;
}

/*
   Author: *Miracle*
   Date: 2019/2/9 10:35:35
*/

换根的时候往往可能会除以0

要警惕!

前后兄弟处理无疑是最好的方法。

原文地址:https://www.cnblogs.com/Miracevin/p/10358462.html

时间: 2024-10-13 20:37:11

fzyzojP2291 -- 小添添的庄园之道路修复的相关文章

[FZYZOJ 2148] 小添添的灰机猫

P2148 -- 小添添的灰机猫 时间限制:1000MS 内存限制:131072KB Description 成功从WTM晋升为ACM的小添添越来越SXBK了,开始将魔爪伸向了自己的灰H机J猫.事情是这样的,小添添有k只猫,分别是0~k-1.他先用rand() % k随机出了N个数,告诉你他需要临幸的灰机猫的编号,如果一只猫多次出现,也只算一次.因为小添添一开始就按照自己喜欢的顺序排好了编号,所以选出来的猫的顺序不能乱.请告诉他他将临幸哪些灰机猫. Input Format 第一行输入两个正整数

总结一哈小添添之前讲的几种布局

LinearLayout 不解释 RelativeLayout 不解释 FrameLayout 后加进来的控件覆盖前面的控件 TableLayout 属性在下面 AbsoluteLayout 要设置x.y其实我觉得很麻烦诶 懒得用 GridLayout 贼方便 TableLayout可设置的属性包括全局属性及单元格属性. 1.全局属性也即列属性,有以下3个参数: android:stretchColumns 设置可伸展的列.该列可以向行方向伸展,最多可占据一整行. android:shrinkC

ESXI6.0实践——逐渐凑出个小主机(APU)

向来VMware与Intel合作更深入,所以,一般配置个ESXI机箱大都是采用intel的CPU,很少有使用AMD搭建EXSI的文章出现.诚然,intel在技术和与VMware的合作优化确实很好,Intel的cpu性能也更好,兼容性也更好,但是架不住AMD的CPU便宜啊,量足啊(线程).所以,在逛淘宝的时候发现了一张惠普A6 7310的主板,集成APU,散热,才200不到,于是买回来做一个ESXI的实验机. 下面,开始凑主机:一.主板(集成CPU,显卡,自带散热):主板是在淘宝上看到的惠普HP

时钟特效程序

做了个特效小程序,在过程中发现自己在学过的知识中有掌握的不够牢固的,今天在这里复习一下: 一.三目运算符中能否使用{}吗? 不可以,三目运算符的语法:条件 ? 结果1 : 结果2; 结果不可以用语句代替 二.canvas可以嵌套吗? 不可以, 1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta charset="UTF-8"> 5 <title><

献给初学编程的你

1.这多对象啥时候能学完? 此刻IT新手艺日新月异.就经常使用编程说话而言,有c/c++.汇编.java,c#.Python等;操作系统平台有unix /linux,windows系列;开拓对象有VC.visualStudio2008.Eclipse.NetBeans等:每个大平台下,还有良多的 的标的手段:如收集.数据库.剧本.HTML.静态网站.游戏开拓等:有人还在学Dreamweaver做网页.Flash做动画.Photoshop做美 工.3DMax做三维动画----是的,我们什么都想学.

机器令砍菜刀

机器令侃菜刀 张卫<原创歌曲  歌词> 句句戳中内心,河南东部和山东西部听得懂 是不是一个人太久了 总觉得时间在翻倍的过 我不知道自己在找什么 只觉得丢了很多 星星还是那颗星星 但被霾遮住了光明 我怀念狗屁不通的光阴 最初的节奏你听 (二八二五六 二八二五七 二八二九三十一 三八三五六 三八三五七 三八三九四十一) 你知道我有多想回到老家活泥巴 再邀子那些光腚伙家去坑里逮青蛙 给俺爷爷卷袋烟叶 听俺奶奶拉拉呱 他们这一代人没有文化但是很伟大 我想不起来那台黑白电视演哩啥 也想不起来鞠萍姐姐当年

直板何时用推挡,何时用反面横打

虽然说目前横板大刀行天下,但中国的国情决定了直板打法仍然生命力旺盛.我也是一名直板打法爱好者,随着王皓的直板横打技术的日臻完善,不少直板球友也在学习.效仿.按理说,反手增加了横打技术,应该弥补了反手防守的弱点,甚至说反手反而成为进攻的利器.特别业余球友在平时练习中由于思维和肌肉的放松,使得反手不论推挡还是横打都显得游刃有余,屡试不爽,成为不少球友得以炫耀的技术资本.但一旦打起比赛来,反手并不像自己想象中那样好使.要么使用的频率很少,要么失误很多,非但没有增加防守的稳定性,反而使得自己的攻击力大打

把最好的时间留给自己,而不是卖给老板

写文章注册登录 首页 下载App × 把最好的时间留给自己,而不是卖给老板 潇洒一朵云 关注 2017.08.25 22:53* 字数 1186 阅读 277评论 7喜欢 8 工作狂 没生活 工作永远做不完,请留一点时间给自己. 2017年8月25日    星期五      雨 马路两旁的灯睁累了双眼,放出微微的黄光,像极了弱不禁风的病秧子.幸好,狂风暴雨已过,灯柱还立着,灯芯还亮着. 十点钟的夜如此静,静的能听到雨后草丛中的蛐蛐声,以及往来车辆轮胎与柏油路面呲呲的摩擦声. 01 宁静的夜,你不

数据结构第九、十章期末复习

第九章:查找 静态查找表: 1.顺序表的查找:顺序查找 从后往前找,0单元设置哨兵 存储形式是顺序表或者是线性链表 查找算法的平均查找长度= 查找成功时的平均查找长度+查找不成功时的平均查找长度 则顺序查找的不成功长度:每个元素不成功的长度都是(n+1),即每次不成功实际上都是跟关键字比较了(n+1)次 顺序查找的平均查找长度是:3*(n+1)/4 有序表的查找:折半查找 限于顺序存储结构,且是有序表 low的初始值为1,零单元设哨兵,high为序列的长度 查找成功的平均查找长度是: 3.索引顺