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\) 即可。

转移显然仅分为两种:

  1. 转移到 \(f_{i,i}\),此时 \(i\) 处填 \(0\)
  2. 转移到 \(f_{i,j}\),此时 \(i\) 处填 \(1\)

前者我们单独转移,后者的转移我们可以考虑通过双指针来维护。通过双指针将非法区间清 \(0\),然后填入 \(1\) 等价于区间乘以一个数,注意到是整体乘法,我们不妨打一个乘法标记,然后每次加入数的时候给其除以此值即可。

复杂度为 \(\mathcal O((n+q)x)\)

posted @ 2020-09-11 20:10  Soulist  阅读(168)  评论(0编辑  收藏  举报