题意

有一个长度为 \(n\) 的整数列 \(a_1, a_2, \cdots, a_n\) ,每个元素在 \([1, x]\) 中的整数中均匀随机生成。

  • 有 \(q\) 个询问,第 \(i\) 个询问的结果是下标在 \([l_i , r_i ]\) 的元素的最小值。
  • 求这 \(q\) 个询问结果的最大值的期望,\(\bmod 666623333\) 。

数据范围

\(1 \le n, q, x \le 2000\) 。

题解

参考了 fjzzq2002 的题解。

有个很有用的结论。

对于非负实数变量 \(X\) 我们有:

\[\mathbb E(X) = \int_{0}^{\infty} P(X \ge x) \mathrm dx
\]

对于 \(X\) 是离散的非负整数变量的情况,我们有:

\[\mathbb E(X) = \sum_{x = 1}^{\infty} P(X \ge x)
\]

如何理解呢?我们可以考虑期望的定义式 \(\mathbb E(X) = \sum_{x} P(X = x) x\) 其实是一个数面积的过程,也就是积分。

然后等式两边的其实就是数面积的两种过程,一个是竖着数,另外一个是横着数。

推广一下其实如果是求 \(\mathbb E(f(X))\) 我们考虑求导后积分也就是:

\[\mathbb E(f(x)) = \int_{0}^{\infty} f'(x) P(X \ge x) \mathrm dx
\]

我们套用这个后就有

\[\mathbb E(ans) = \sum_{i = 1}^\infty P(ans \ge i) = \sum_{i = 0}^{x - 1} (1 - P(ans \le i))
\]

这样就好做多了,考虑枚举 \(i\) ,然后算 \(P(ans \le i)\) 也就是,每个区间的 \(\min\) 都 \(\le i\) 的概率,假设这个 \(i = t\) 。

我们发现如果一个区间包含另外一个区间的话,那么它的最小值一定不会比小区间大,所以一定不会贡献到答案,那么我们可以去掉大区间。转化后,所有区间就是互不包含的了。

考虑记 \(f_i\) 为右端点不超过 \(i\) 的区间询问结果都 \(\le t\) 的概率。

如果不存在一个 \(r = i\) ,那么就是 \(f_i = f_{i - 1}\) 。

否则记右端点为 \(i\) 的区间左端点为 \(j\) ,枚举区间内最后一个 \(\le t\) 的数的位置 \(l\) ,那么我们有

\[f_i = \sum_{l = j}^{i} f_{l - 1} \frac tx (1 - \frac tx)^{i - l}
\]

然后发现是 \(\mathcal O(xn^2)\) 的,发现它能跑过QAQ

显然我们可以使它更加正确,推导一下式子就有(注意有 \(t < x\) )

\[f_i = \frac tx (1 - \frac tx)^i \sum_{l = j}^{i} f_{l - 1} (1 - \frac tx)^{- l}
\]

然后我们就可以用前缀和优化到 \(\mathcal O(xn)\) 。

其实还可以继续优化。。

观察转移方程发现答案其实是一个关于 \(\displaystyle \frac tx\) 的 \(\mathcal O(n)\) 次多项式,也就是关于 \(i\) 的 \(\mathcal O(n)\) 次多项式。

所以它的前缀和仍然是一个 \(\mathcal O(n)\) 次多项式,我们算出前 \(\mathcal O(n)\) 项和前缀和,插值出 \(x\) 处的前缀和即可。复杂度就优化成 \(\mathcal O(n^2)\) 啦。

代码

#include <bits/stdc++.h>

#define For(i, l, r) for (register int i = (l), i##end = (int)(r); i <= i##end; ++i)
#define Fordown(i, r, l) for (register int i = (r), i##end = (int)(l); i >= i##end; --i)
#define Rep(i, r) for (register int i = (0), i##end = (int)(r); i < i##end; ++i)
#define Set(a, v) memset(a, v, sizeof(a))
#define Cpy(a, b) memcpy(a, b, sizeof(a))
#define debug(x) cout << #x << ": " << (x) << endl
#define l first
#define r second using namespace std; typedef pair<int, int> PII; template<typename T> inline bool chkmin(T &a, T b) { return b < a ? a = b, 1 : 0; }
template<typename T> inline bool chkmax(T &a, T b) { return b > a ? a = b, 1 : 0; } inline int read() {
int x(0), sgn(1); char ch(getchar());
for (; !isdigit(ch); ch = getchar()) if (ch == '-') sgn = -1;
for (; isdigit(ch); ch = getchar()) x = (x * 10) + (ch ^ 48);
return x * sgn;
} void File() {
#ifdef zjp_shadow
freopen ("P3600.in", "r", stdin);
freopen ("P3600.out", "w", stdout);
#endif
} const int N = 2e3 + 1e2, Mod = 666623333; inline int fpm(int x, int power) {
int res = 1;
for (; power; power >>= 1, x = 1ll * x * x % Mod)
if (power & 1) res = 1ll * res * x % Mod;
return res;
} int n, x, q, len, f[N]; PII S[N]; int V[N], powb[N], invpowb[N], sum[N]; int main () { File(); n = read(); x = read(); q = read(); For (i, 1, q)
S[i].l = read(), S[i].r = read();
sort(S + 1, S + q + 1);
For (i, 1, q) {
bool flag = true;
For (j, i + 1, q)
if (S[i].l <= S[j].l && S[j].r <= S[i].r) flag = false;
if (flag)
V[S[i].r] = S[i].l;
} int ans = 0, invx = fpm(x, Mod - 2);
Rep (v, x) {
f[0] = powb[0] = invpowb[0] = 1;
int coef = 1ll * v * invx % Mod;
powb[1] = (Mod + 1 - coef) % Mod;
invpowb[1] = fpm(powb[1], Mod - 2);
For (i, 2, n) {
powb[i] = 1ll * powb[i - 1] * powb[1] % Mod;
invpowb[i] = 1ll * invpowb[i - 1] * invpowb[1] % Mod;
}
For (i, 1, n) {
sum[i] = (sum[i - 1] + 1ll * f[i - 1] * invpowb[i]) % Mod;
if (!V[i]) f[i] = f[i - 1];
else f[i] = 1ll * (Mod + sum[i] - sum[V[i] - 1]) * coef % Mod * powb[i] % Mod;
}
(ans += Mod + 1 - f[n]) %= Mod;
}
printf ("%d\n", ans); return 0; }

Luogu P3600 随机数生成器(期望+dp)的更多相关文章

  1. 洛谷P3600 随机数生成器(期望dp 组合数)

    题意 题目链接 Sol 一条重要的性质:如果某个区间覆盖了另一个区间,那么该区间是没有用的(不会对最大值做出贡献) 首先不难想到枚举最终的答案\(x\).这时我们需要计算的是最大值恰好为\(x\)的概 ...

  2. luogu P3600 随机数生成器【dp】

    把期望改成方案数最后除一下,设h[i]为最大值恰好是i的方案数,那么要求的就是Σh[i]*i 首先包含其他区间的区间是没有意义的,用单调栈去掉 然后恰好不好求,就改成h[i]表示最大值最大是i的方案数 ...

  3. 洛谷P3600随机数生成器——期望+DP

    原题链接 写到一半发现写不下去了... 所以orz xyz32768,您去看这篇题解吧,思路很清晰,我之前写的胡言乱语与之差距不啻天渊 #include <algorithm> #incl ...

  4. Luogu P3600 随机数生成器

    Luogu P3600 随机数生成器 题目描述 sol研发了一个神奇的随机数系统,可以自动按照环境噪音生成真·随机数. 现在sol打算生成\(n\)个\([1,x]\)的整数\(a_1...a_n\) ...

  5. Luogu P3251 [JLOI2012]时间流逝 期望dp

    题面 题面 题解 期望\(dp\)好题! 今年\(ZJOI\)有讲过这题... 首先因为\(T\)只有\(50\),大力\(dfs\)后发现,可能的状态数最多只有\(20w\)左右,所以我们就可以大力 ...

  6. 洛谷 P3600 - 随机数生成器(期望 dp)

    题面传送门 我竟然独立搞出了这道黑题!incredible! u1s1 这题是我做题时间跨度最大的题之一-- 首先讲下我四个月前想出来的 \(n^2\log n\) 的做法吧. 记 \(f(a)=\m ...

  7. luoguP3600 随机数生成器 期望概率DP + DP优化

    这篇题解更像对他人题解的吐槽和补充? 考虑答案 $E[X] = \sum\limits_{i = 1}^{x} i P(X = i)$ $P(X = i)$不好求................(其实 ...

  8. P3600 随机数生成器

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  9. Luogu P1850 换教室(期望dp)

    P1850 换教室 题意 题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有\(2n\)节课程安排在\(n\)个时间段上.在第\(i(1\l ...

随机推荐

  1. 轨迹系列5——验证轨迹GPS坐标转换为本地坐标的四/七参数是否准确的一种方案

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1. 背景 目前对多个项目轨迹不准确的情况做了排查,发现导致轨迹偏移百分 ...

  2. iOS----------网络请求错误

    Error Domain=com.alamofire.error.serialization.response Code=-1016 "Request failed: unacceptabl ...

  3. Android远程桌面助手(Build 0662)

    ARDC Build 0662, Jul 19, 2017 OPT: 1440*2560及以下分辨率设备,帧速能稳定在20帧~25帧 FIX: 拖拽文件的路径中包含空格的处理 ADD: 支持Ctrl+ ...

  4. Django2.0 正则表示匹配的简单例子

    在Django中,使用正则表达式,匹配Url 默认情况下,url固定格式如下: urlpatterns = [ path('admin/', admin.site.urls), ] 如果需要使用正则表 ...

  5. Spark SQL,如何将 DataFrame 转为 json 格式

    今天主要介绍一下如何将 Spark dataframe 的数据转成 json 数据.用到的是 scala 提供的 json 处理的 api. 用过 Spark SQL 应该知道,Spark dataf ...

  6. stereoscopic 3D

    色分(Anaglyph)模式:典型的如红蓝立体,是利用红镜片只允许红光通过,蓝镜片只允许蓝光通过的原理,将两幅视差的图片(一张红色.一张蓝色)叠加构成一张立体图片 由于红蓝立体去掉了绿色分量,会导致最 ...

  7. Python3漏洞扫描工具 ( Python3 插件式框架 )

    目录 Python3 漏洞检测工具 -- lance screenshot requirements 关键代码 usage documents README Guide Change Log TODO ...

  8. 搭建MHA时 yum 安装perl模块提示 baseurl 错误

    今天在搭建MySQL MHA  安装MHA node所需的perl模块(DBD:mysql)时遇到了一个小的错误,如果思路不对的话,还是产生不少麻烦. 现梳理记录下来. 问题现象 执行的命令 yum ...

  9. Github速度慢的解决方法

    首先ping一下github.global.ssl.fastly.net 得到相应的ip,例如我现在ping的ip是151.101.41.194 151.101.41.194 github.globa ...

  10. SQLServer之函数简介

    用户定义函数定义 与编程语言中的函数类似,SQL Server 用户定义函数是接受参数.执行操作(例如复杂计算)并将操作结果以值的形式返回的例程. 返回值可以是单个标量值或结果集. 用户定义函数准则 ...