P5298 Minimax 题解

传送门


C 有一棵 n 个结点的有根树,根是 1 号结点,且每个结点最多有两个子结点。

定义结点 x 的权值为:

1.若 x 没有子结点,那么它的权值会在输入里给出,保证这类点中每个结点的权值互不相同

2.若 x 有子结点,那么它的权值有 px 的概率是它的子结点的权值的最大值,有 1px 的概率是它的子结点的权值的最小值。

现在小 C 想知道,假设 1 号结点的权值有 m 种可能性,权值第 i的可能性的权值是 Vi,它的概率为 Di(Di>0),求:

i=1miViDi2

你需要输出答案对 998244353 取模的值。

n3×105


这个式子实在太奇怪了,考虑直接求每一种的概率而不是变形式子。
首先对权值离散化一下。

fx[i] 表示 x 取值为 i 的概率。

  1. x 是叶子,fx[a[i]]=1,其余 0

  2. x 仅有一个儿子,直接继承那个儿子的答案。

  3. x 有两个儿子,记为 c1,c2。对于 fx[i]

    1. ic1 子树内,概率:

    fc1[i](pxj=1i1fc2[j]+(1px)j=i+1mfc2[j])

    1. ic2 子树内,概率:

    fc2[i](pxj=1i1fc1[j]+(1px)j=i+1mfc1[j])

转移方程写出来了,如何优化两个儿子的转移?

发现这是可以用线段树合并优化的。
具体而言,当位于结点 u 合并完时,让第 i 个叶子结点保存 fu[i]

如何合并两个儿子的线段树得到 u 的?设当前合并到两棵线段树的根位于 L,R,当前对应的区间是 [lx,rx]

  1. L,R 均非 0,递归进入 L,R 的左儿子和右儿子合并,然后 pushup。

  2. L0,R=0,相当于 fc1[lxrx]=0,所以第一条转移方程没用了(fc1[i]=0),而对于第二条转移方程,我们需要知道对每个 i[lx,rx] 都知道 pxj=1i1fc1[j]+(1px)j=i+1mfc1[j]

    因为 fc1[lxrx]=0,且 i[lx,rx] 所以这个东西等于 pxj=1lx1fc1[j]+(1px)j=rx+1mfc1[j]。我们惊奇地发现这个东西对所有 i[lx,rx] 是相等的,而且可以在线段树合并下传参数时维护:额外记录两个参数 L1,R1L1=j=1lx1fc1[j]R1=j=rx+1mfc1

  3. L=0,R0,是对称的,记录参数 L2,R2 即可。

总复杂度 O(nlogn)

posted @   FLY_lai  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示