Luogu 随机数生成器
随机数生成器
sol 研发了一个神奇的随机数系统,可以自动按照环境噪音生成真·随机数。
现在 sol 打算生成 \(n\) 个 \([1,x]\) 的整数 \(a_1, ..., a_n\),然后进行一些询问。\(q\) 次询问,每次询问 \(i\) 有两个参数 \(l_i\) 和 \(r_i\),sol 会计算 \(\min_{l_i \leq j \leq r_i} a_j\)(\(a\) 数组中下标在 \(l_i, r_i\) 之间的数的最小值)。
最后测试结果会是这些询问得到的结果的最大值。
sol 进行了很多次实验,现在他想问问你测试结果的期望大小是多少,对 \(666623333\) 取模。
\(n,x,q\le 2000\)
\(\rm Sol:\)
将期望转为 \(\sum P(X\ge x)\),枚举 \(x\),那么对于 \(<x\) 的数我们设为 \(0\),大于的设为 \(1\),问题等价于求方案数使得至少存在一个区间全 \(1\)
将每个区间规定在右端点,我们 Dp 出不存在一个区间全 \(1\) 的概率,这个条件又等价于区间内至少有一个 \(0\),设 \(f_{i,j}\) 表示考虑到位置 \(i\),离 \(i\) 最近的 \(0\) 位置为 \(j\) 的方案数,那么我们枚举 \(i\) 处的区间,然后将小于的 \(j\) 清 \(0\) 即可。
转移显然仅分为两种:
- 转移到 \(f_{i,i}\),此时 \(i\) 处填 \(0\)
- 转移到 \(f_{i,j}\),此时 \(i\) 处填 \(1\)
前者我们单独转移,后者的转移我们可以考虑通过双指针来维护。通过双指针将非法区间清 \(0\),然后填入 \(1\) 等价于区间乘以一个数,注意到是整体乘法,我们不妨打一个乘法标记,然后每次加入数的时候给其除以此值即可。
复杂度为 \(\mathcal O((n+q)x)\)