概率+树规 熟练剖分

概率树程序 一段MATLAB程序,生成一颗概率树,非常有趣! 立即下载

这里写图片描述
这里写图片描述

根节点不一定是1,但是是一个确定的点,看谁不是儿子就行了。。
这道题我们考虑从儿子推到根。设f[i][j]表示以i为根的子树中,最长轻链长度为j的概率。
因为每一个son被选为重儿子的概率相同,且重儿子对父亲贡献和轻儿子不同,所以要每一个点为重儿子,之后挨个枚举每个儿子。这个效率是N^2,然后要枚举链的长度,如果枚举到size[root],相当于N^3,废掉了。。但只要枚举到size[son]+1就好了。更大不会再有意义,概率一定为零。
在计算答案时要再次用到f数组,所以要先存一下,再转过去。
对于每一次枚举重儿子时枚举所有儿子时的计算方法。g[i][j]表示i节点子树中最长链长为0~j的概率之和。
f[i][j]=f[son][j]*g[i][j]+g[son][j]*f[i][j]-f[i][j]*f[son][j];(对于重儿子)
考虑一次向答案上添加一个子节点。那么父节点最长为j的链出现地方有两种可能。1,出现在之前已经添加到答案中的子节点里(f[i][j]),那么这时新添加的子节点的长度只要在0~j中哪一个都无所谓了。同理,最长j出现在新添加的节点中,那之前添加的多长也就无所谓了。。。
那么对于轻儿子呢?不同于重儿子,轻儿子与父亲的连边会对答案造成贡献,所以只要把son的j改成j-1即可。
最后统计答案:根节点子树中最长轻链长为j的概率*j,加个和就好了。
对于除法,乘逆元即可。
注:最好别看我代码,巨丑,还难理解。。。我把f和g数组合二为一了。。。。

#pragma GCC optimize("O3")
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 3005
#define mod 1000000007
#define ll long long
using namespace std;
int read()
{
    int sum=0,f=1;char x=getchar();
    while(x<'0'||x>'9'){if(x=='-')f=-1;x=getchar();}
    while(x>='0'&&x<='9'){sum=(sum<<1)+(sum<<3)+x-'0';x=getchar();}
    return sum*f;
}
struct road{int v,next;}lu[N*2];
int n,e,adj[N];
ll out[N],sz[N],g[N],h[N],f[N][N];
bool v[N];
inline ll cheng(ll x,int m)
{
    ll ans=1;
    while(m)
    {
        if(m&1)ans=ans*x%mod;
        x=x*x%mod;
        m/=2;
    }
    return ans;
}
inline void dfs(int x)
{
    sz[x]=1;
    for(int i=adj[x];i;i=lu[i].next)
    {
        dfs(lu[i].v);
        sz[x]+=sz[lu[i].v];
    }
    ll fm=cheng(out[x],mod-2);
    for(int i=adj[x];i;i=lu[i].next)
    {
        int zz=lu[i].v;
        for(int j=0;j<=n;j++)g[j]=1;
        for(int j=adj[x];j;j=lu[j].next)
        {
            int to=lu[j].v;
            for(int k=0;k<=sz[to]+1;k++)
            {
                ll s=g[k],sum=f[to][k];
                if(k)s-=g[k-1],sum-=f[to][k-1];
                if(s<0)s+=mod;if(sum<0)sum+=mod;
                if(to==zz)
                    h[k]=((sum*g[k]+s*f[to][k]-sum*s)%mod+mod)%mod; 
                else if(k)
                {
                    sum=f[to][k-1];if(k!=1)sum-=f[to][k-2];
                    if(sum<0)sum==mod;
                    h[k]=((sum*g[k]+s*f[to][k-1]-sum*s)%mod+mod)%mod;
                }
            }
            g[0]=h[0];h[0]=0;
            for(int k=1;k<=sz[to]+1;k++)g[k]=(g[k-1]+h[k])%mod,h[k]=0;
        }
        for(int j=sz[x];j>=1;j--)g[j]=(g[j]-g[j-1]+mod)%mod;
        for(int j=0;j<=sz[x];j++)f[x][j]=(f[x][j]+g[j]*fm%mod)%mod;
    }
    if(!adj[x])f[x][0]=1;
    for(int i=1;i<=n;i++)f[x][i]=(f[x][i]+f[x][i-1])%mod;
}
int main()
{
    //freopen("tree.in","r",stdin);
    //freopen("tree.out","w",stdout);
    n=read();
    for(int i=1;i<=n;i++)
    {
        int k=read();out[i]=k;
        for(int j=1;j<=k;j++)
        {
            int x=read();v[x]=1;
            lu[++e]=(road){x,adj[i]};adj[i]=e;
        }
    }
    int root;
    for(int i=1;i<=n;i++)if(!v[i])root=i;
    dfs(root);
    ll ans=0;
    for(ll i=1;i<=n;i++)
        ans=(ans+i*(f[root][i]-f[root][i-1]+mod)%mod)%mod;
    cout<<ans;
}
NVIDIA 2025 Board Design Engineer 校招笔试 电路分析,矩形波阶跃反馈驱动​,误差信号。非常简单,数电or​离散基础。第一题是考试规矩知情确认。大二暑假做的,纯体验​。五六题太长,下篇分享。 阅读详情

相关推荐

步进电机梯形加减速算法的实现

步进电机梯形加减速算法的实现

m0_69251699的博客 1318

【笔记】树链(熟练)剖分

/*参考https://www.cnblogs.com/LoveYayoi/p/6745541.html https://www.cnblogs.com/George1994/p/7821357.html 以及我校学长的优秀讲解。 */ 树链剖分可以将树剖分成一条一条的链,形成一条新链,然后通过一些维护线性数据的数据结构(比如线段树)来维护树上的信息,例如 树上求两点间边or点...

dmqqndlx85675的博客 442

Linux系统安装AutoDockTools、AutoGrid和AutoDock并实现分子对接(详细讲解)

linux系统为centos7.0 按照下面操作安装AutoDockTools(MGLTools) 1. 下载安装包,链接(https://ccsb.scripps.edu/mgltools/downloads/),我的linux系统是64位,下载红色标记源代码,拷贝入linux目标文件夹下。 2. shell终端进行安装: 1. 终端进入安装包所在文件夹,并获取root权限;赋予代码安装权限; cd /home/... #目标文件夹,根据目标程序文件位置进行更改 su #获

carlos_zhao的博客 1万+

B. 熟练剖分(tree) (概率DP)

一道概率神题,考试时没读清题考完看了学长的玄学题解看了好几个小时 首先f[i][j]表示在点 i 为根的子树中,向下最长轻链长度小于等于 j 的概率。 首先递归下去并求出子树大小,然后枚举重儿子,枚举该点最长轻链长度,再次枚举儿子节点并逐个 假设当前枚举的重儿子是to1,枚举到儿子节点to2,x最长轻链长度为k,设gs为v(to2)之前考虑的儿子中最长轻链长度为k的概率如果v(to...

weixin_30340819的博客 310

FeynRules的上手使用3--运行

FeynRules的运行 接上两篇,在我们正确的设定模型参数和拉氏量之后,就可以运行FeynRules来推导费曼规则。 装载文件 首先需要设定FeynRules文件所在位置,并装载FeynRules模块: $FeynRulesPath = SetDirectory[ ] << FeynRules` 接下来是装载写好的模型文件: LoadModel[ < file.fr >, < file2.fr >, … ] 模型文件后缀为".fr",可以分几块构成。模型描述可以写在

cool_bot的博客 1075

SAP物料分类账实战:从配置到月结的关键步骤(基于S/4HANA1909)

本文详细解析了在SAP S/4HANA 1909系统中,物料分类账从基础配置到月结操作的全流程。作为成本核算的核心,物料分类账通过多级价格确定实现实际成本核算,关键步骤包括激活物料分类账、配置自动过账科目(OBYC)、运行CKMLCP进行差异分摊与结算。文章旨在帮助财务与成本会计人员确保成本差异的准确归集与分摊,顺利完成月结。

weixin_28314575的博客 196

树链剖分

熟练剖分就是 一种 机智的办法, 让人在一棵树上建出一棵线段树。 这个介绍比较经典 #include #include #include #include #include #define MAXN 200005 #define INF 1<<31 using namespace std; int n, ss[MAXN], tt[MAXN], c[MAXN], ti[MAXN

lalala 445

Flutter 直接调用so动态库,或调用C/C++源文件内函数

我把 .so 文件尝试放过好几个目录/lib/,最终都会报这个错误,现在才知道库文件需要放在你根本想象不到的地方!!!尝试了一些方法还是不行后我放弃了 ffi,想着用 Flutter 的 MethodChannel 桥接 android/ios 原生,再让原生去调 native 层。一顿操作把Android端的搞定了,当然中间涉及到 Kotlin和C++ 层的数据类型映射的痛苦,而且业务函数也不像一个 helloworld 那么简单,别提有多痛苦了。

开发以大橘为重 8352

树链剖分算法详解

学OI也有一段时间了,感觉该搞点东西了。 于是学习了树(熟)链(练)剖(pou)分(粪) 当然,学习这个算法是需要先学习线段树的。不懂的还是再过一段时间吧。 如果碰到一道题,要对一颗树的两个点中的最短路径、以u为根的子树之类的东西进行修改或者查询,那么大概就是树链剖分的题了。 树链剖分就是把一颗树的节点按照新的顺序扔到一颗线段树里面,然后保证一条树链上的点在线段树中尽可能连续...

dfssbqyrq96616258的博客 239

【异常】OpenClaw LLM Request Timeout 超时问题的快速定位与落地解决

摘要:OpenClaw系统在执行任务时频繁出现"LLM request timed out"异常。通过分析发现主模型自动调度导致响应延迟,且缺乏超时配置兜底。解决方案包括:1)将主模型切换为低延迟的豆包2.0 Lite;2)保留豆包2.0 Pro和Kimi作为备用;3)重启Gateway服务验证。优化后系统响应速度显著提升,未再出现超时异常。后续建议增加显式超时配置、优化任务拆分和Prompt指令,并建立网络监控机制。(148字)

奶爸的编程之路,也就一周冷个三天 1159

YOLOv11改进,YOLOv11引入B2CNet的BFAM(双时相特征聚合模块),JSTARS 2024,二次创新C3k2结构

YOLOv11改进,YOLOv11引入B2CNet的BFAM(双时相特征聚合模块),JSTARS 2024,二次创新C3k2结构

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 408

POJ - 2763 树链剖分

树链剖分(轻重链剖分) 仔细想想 自己第一次听说这个这个数据结构大概有两年半的时间了 然而一直不会. 不过现在再回头来看 发现其实也不是很麻烦 首先 在学树链剖分之前最好先把 树形 以及序这三个知识点学了 如果这三个知识点没掌握好的话 树链剖分难以理解也是当然的 -------------------------------------------------------

Courage_kn的博客 548

基于FPGA的相控阵雷达波束控制系统设计(2)

也就是在计算波控码时0,按2.8125递增,取遍-90

qq_43416206的博客 1812

树规+背包

最近做的好题挺多,写下题解;树规+背包专题:熟练pou分:感觉还是学长的方法比较好,直接dp方案数,最后乘概率,简单有效;树上染色:一开始dp式想错(以下为错误题解){考虑到每个子树的情况,易想到f[i][j][0/1]表示以i为根的子树中,(i为黑/白子)j个黑子的最优值;d[i][j][0/1][0/1]表示对应状态下子树中所有黑/白子到根节点距离;后来发现这只能满足局部最优而不能满...

dichanzhuo4635的博客 174

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【[SHOI2014]概率充电器】

这是一道概率+树形\(dp\) 首先我们看到这里每一个的贡献都是1,所以我们要求的期望就是概率 求得其实就是这个 \[\sum_{i=1}^nP_i\] \(P_i\)为节点\(i\)通电的概率 显然节点\(i\)通电有三种可能 它自己来电了 它的子树里有一个点来电了传了过来 它的子树外面有一个点来电了传了过来 第一种情况最好考虑了,至于第二种和第三种我们好像很难解决的样子 但是这显...

weixin_30702887的博客 71

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

点分治&动态点分治小结

(写篇博客证明自己还活着×2) 转载请注明原文地址:http://www.cnblogs.com/LadyLex/p/8006488.html 有的时候,我们会发现这样一类题:它长得很像一个$O(n)$的树规, 但是却很难用单独的数组维护对应的信息,这样我们就有了淀粉质点分治。 通过直接统计($O(nlogn)$)或者加上数据结构(比如树状数组,堆,线段树等等)维护信息($O(nlog^...

weixin_30520015的博客 213

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

noip知识范围

数论: 快速幂,快速乘 费马小定理 欧拉定理 拓展欧几里得 筛素数 组合数取模(这个,背背代码吧,反正比较好记) 乘法逆元 矩阵 中国剩余定理(也比较好记) 容斥原理 01分数规划 大步小步算法数据结构: 简单的就不说了 单调队列,双端队列(有个容器) 单调栈,堆(手打的,各种操作) 树状数组 线段树 树链剖分 Treap,Splay(两种平衡树,会打) LC

syxEzre的专栏 2042

坑

3个月联赛 不再着急往前去了,看一看自己需要去填的坑 0 不会 1 会,不熟||难想 2 熟&&好想 1.数学: 扩展欧几里得,这个前一阵复习了复习,不过好像又记不太清了,其实就是推式子,见题就打吧。(1 (线筛、求单个)欧拉函数,线筛素数,欧拉定理,还是比较熟的,考场上也现推过几次,要更熟练(1 Lucas,基本忘了,一定要补。(0...

aida9573的博客 66

【某集训记录】

  话说今天是DAY N了吧。。。好吧好吧,也就是DAY12   因为不写日记被嫌弃了。。。捂脸。 DAY XII   考试又炸了= =,T1以为每天只能有一个方向。。。然而,然而事实总是残酷的。T2离散以后数组大小是m离散前是n,好的,大家都知道发生什么了。T3。。眼睛越来越不好使了,n*m<=50愣是看成了n,m<=50,绝望。。。   下午讲了插头,听得是一脸懵逼,...

weixin_30352645的博客 158

noip前集训

10.18 关网了,2333 上午考试,130 rank16 一直在刚T2的割点,却直接弃了一道第一眼看上去不可做但实际并没那么难想的小模拟 但是T2没搞出来是不是也要反思一下,先是割点板子忘了,之后又强行打了spfa判路径一大堆没用的,直接去想最直接的性质不就好了,哎 下午打了CDQ优化斜率dp的货币兑换,感觉根本没学过斜率dp一样,可能这也是在向后期过渡吧。 结了CDQ,开了树的...

weixin_34258078的博客 165

暑假训练2-DP专题

动态规划 基本概念 ->

yunyouxi0's blog 1080

数坑

数一数自己到底挖过多少坑,慢慢填回去…… 我不会啥 我百嘛不会……一系列背板失败和不想毒瘤的悲伤故事。 实际上还有很多闻所未闻的知识…… 0:一无所知; 1:对原理略有了解,不清楚实现; 2:实现过,但是不熟练不常用,很难脱离模板。 1)数学: 1.卡特兰数…………2 2.(ex)CRT………….2 3.多项式exp、取模、开方、快速求值、插值、任意模数NTT…...

weixin_34133829的博客 140
上一篇: 数学+图论 建造游乐场
下一篇: 二分图+贪心优化 [2009国家集训队]最大收益
QTY_
博客等级 码龄9年 13粉丝 211原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值