1 条题解
-
0
题目回顾
给定一个长度为 的序列 ,进行 次操作,每次操作等概率随机选择一个区间 (共有 种可能),将该区间内所有数改成该区间的最大值。 求 次操作后每个位置 的期望值,并输出:
算法思路
这个问题如果直接模拟所有可能的操作序列,复杂度太高。 代码采用了 动态规划 + 二维前缀和 的方法,直接计算每个区间在 次操作后的期望和(已乘 )。
状态定义
设 = 经过 次操作后,区间 内所有数都变成该区间原来的最大值时,这个值的和(乘 ) 注意这里 "和" 是指所有可能操作序列下该区间最大值的总和(不是期望,已经乘了 )。
初始时: 因为 次操作时,区间 的最大值就是它本身的最大值,并且只有 种操作序列(不操作),所以乘 后就是它本身。
状态转移
考虑从 转移到 。
一次操作中,我们随机选择一个区间 ,考虑它对区间 的影响:
1. 与 相交但不完全包含
代码中将这种情况分为三类:
且 (左包含)
贡献为:$\sum_{L=1}^{l-1} \sum_{R=r}^{n} f_{t-1}[L][R] \times (r-l+1)$ 代码中对应:Sum(1, l - 1, r, r) * (r - l + 1)
且 (右包含)
贡献为:$\sum_{L=l}^{l} \sum_{R=r+1}^{n} f_{t-1}[L][R] \times (r-l+1)$ 代码中对应:Sum(l, l, r + 1, n) * (r - l + 1)
且 (完全包含但 或 )
贡献为: 代码中对应:Sum(1, l - 1, r + 1, n)
2. 完全等于 或不相交
完全等于
区间数: 贡献:
与 不相交
区间数: 贡献:$f_{t-1}[l][r] \times \left( \text{Val}(l-1) + \text{Val}(n-r) \right)$
在 内部(但不等于 )
区间数: 贡献:
这三部分合并为: $f_{t-1}[l][r] \times \left( \text{Val}(r-l+1) + \text{Val}(l-1) + \text{Val}(n-r) \right)$
复杂度分析
空间复杂度:(使用滚动数组)
时间复杂度:
对于 , 可以接受
最终输出
最终只需要输出每个位置 的值,即 ,因为单个位置 可以看作区间 。
总结
这道题通过巧妙的 DP 设计,将随机操作的影响转化为对区间最大值的统计,利用二维前缀和优化转移,避免了直接枚举所有可能的操作序列,在多项式时间内解决了问题。
- 1
信息
- ID
- 4848
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者