【题解】CF494C Helping People

思路

ST 表 + 树形 dp.

首先注意到 q5×103 并且区间互不相交,这实际上给出了一个很强的结论:

考虑把每个区间向它的子区间连边,得到的一定是一个森林。

只要我们钦定存在一个概率为 0 的操作 [1,n],那么最终得到的一定是一棵树。

构造这棵树可以考虑使用栈。

首先将所有区间优先按左端点升序排列,左端点相同则按右端点降序排列。此时任意区间的子区间均在其后。

使用一个栈存下当前区间的所有父区间。每右移一位就将所有右端点在当前区间左端点左侧的区间移除。

因为左端点升序,所以该区间一定是当前区间最小的父区间。

然后将当前区间入栈。

建树时间复杂度 O(nlogn)


考虑到 E(max)max(E),直接将期望设进状态是不好做的。

只能考虑使用期望的定义,考虑每种最大值出现的概率。

钦定最大值求概率依旧很困难,考虑弱化成钦定最大值不超过某定值,这样最后的答案容斥一下就行。

于是考虑令 f[u][i] 为结点 u 子树中的操作完成后,该结点对应区间的最大值不超过 i 的概率。

转移容易推导:f[u][i]=puvson(u)f[v][i1]+(1pu)vson(u)f[v][i].

但是第二维的值域是 [1,109],必须优化一下 /fn

注意到每次操作至多使最大值增加 1,也就是 q 次操作后最大值的增量不超过 q,于是令第二维变成在原有区间最大值基础上的增量就行。

w(u) 为结点 u 对应区间的初始最大值,有转移:

f[u][i]=puvson(u)f[v][i+w(u)w(v)1]+(1pu)vson(u)f[v][i+w(u)w(v)].

特别地,当 i=0 时只取后一半转移。

答案为 f[1][0]w(1)+i=1q(f[1][i]f[1][i1])(w(1)+i).

于是可以在 O(nlogn+q2) 的复杂度内解决此题。

代码

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