luoguP3600 随机数生成器

题目描述

sol研发了一个神奇的随机数系统,可以自动按照环境噪音生成真·随机数。
现在sol打算生成n个[1,x]的整数a_1…a_n,然后进行一些询问。
q次询问,每次询问i有两个参数li和ri,sol会计算min⁡li&lt;j&lt;riaj\min_{li&lt;j&lt;ri}ajminli<j<ri​aj
​ (a数组中下标在li、ri之间的数的最小值)。

最后测试结果会是这些询问得到的结果的最大值。

sol进行了很多次实验,现在他想问问你测试结果的期望大小是多少,对666623333取模。

分析

神仙期望Dp
运用整数概率公式E(x)=∑iinf⁡P(i≤x)E(x)=\sum_i^{\inf}P(i\leq x)E(x)=∑iinf​P(i≤x)
可以把题目转化为求maxi{min⁡j=liriaj}≥smax_i\{\min_{j=li}^{ri}a_j\} \ge smaxi​{minj=liri​aj​}≥s的概率
技巧:任意性问题一般比较好入手。
于是转化成
maxi{min⁡j=liriaj}≤s−1&ThickSpace;⟺&ThickSpace;∀i.∃j∈[li,ri]aj≤s−1max_i\{\min_{j=li}^{ri}a_j\} \le s-1\iff \forall i. \exists j\in[l_i,r_i]a_j\le s-1maxi​{minj=liri​aj​}≤s−1⟺∀i.∃j∈[li​,ri​]aj​≤s−1
如此看上去就变成了一个比较可做的问题。
我们发现互相包含的区间可以直接忽略大的那个。
于是询问区间左右端点递增
用f[i][j]f[i][j]f[i][j]表示前iii个数满足了j个区间的概念。转移随便转转可以有O(n3)O(n^3)O(n3)
考虑这个问题的对偶问题,就是每个点可以满足多少个区间。
这个时候每个点满足的区间的编号一定也是一个连续的区间,而且也满足左右端点单调。
点和区间互化之后。问题转化为若干个区间,每个区间选择的概率是p(p=s−1x)p(p=\frac{s-1}{x})p(p=xs−1​),求覆盖所有点的概率。
方程搞一搞,用f[i]f[i]f[i]表示iii是最后一个选的区间,覆盖前面所有点的概率
f[i]=p(∑l[j]≥r[i]−1f[j]⋅(1−p)i−j−1+[l[i]=1](1−p)i−1)f[i]=p(\sum_{l[j]\ge r[i]-1} f[j]\cdot (1-p)^{i-j-1}+[l[i]=1](1-p)^{i-1})f[i]=p(∑l[j]≥r[i]−1​f[j]⋅(1−p)i−j−1+[l[i]=1](1−p)i−1)
答案是∑r[i]=nf[i]⋅(1−p)n−i\sum_{r[i]=n} f[i]\cdot (1-p)^{n-i}∑r[i]=n​f[i]⋅(1−p)n−i
优化一下
f[i]=p((1−p)i−1∑l[j]≥r[i]−1f[j]⋅(1−p)−j+[l[i]=1](1−p)i−1)f[i]=p((1-p)^{i-1}\sum_{l[j]\ge r[i]-1} f[j]\cdot (1-p)^{-j}+[l[i]=1](1-p)^{i-1})f[i]=p((1−p)i−1∑l[j]≥r[i]−1​f[j]⋅(1−p)−j+[l[i]=1](1−p)i−1)
双指针扫一扫就行了。
前半段套路,后半段区间-点转化模型要记得

代码

#include<cstdio>
#include<algorithm>
int ri() {char c = getchar(); int x = 0, f = 1; for(;c < '0' || c > '9'; c = getchar()) if(c == '-') f  = -1;for(;c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) - '0' + c; return x * f;
}
const int P = 666623333, N = 5000;
struct Sec {int l, r;}x[N], y[N];
bool cmp(Sec a, Sec b) {return a.l == b.l ? a.r < b.r : a.l < b.l;}
int f[N], pw[N], ia, n, tp, m;
int Pow(int x, int k) {int r = 1;for(;k; x = 1LL * x * x % P, k >>= 1) if(k & 1) r = 1LL * r * x % P;return r;
}
int Cal(int x) {if(!x) return 0;int p = 1LL * x * ia % P, g = (1 + P - p) % P;pw[tp] = 1; int iv = Pow(g, P - 2), A = 0;for(int i = 1;i <= tp; ++i) pw[tp + i] = 1LL * pw[tp + i - 1] * g % P, pw[tp - i] = 1LL * pw[tp - i + 1] * iv % P;int L = 1, R = 0, s = 0;for(int i = 1;i <= tp; ++i) {for(;L <= R && y[L].r < y[i].l - 1; ++L) s = (s - 1LL * f[L] * pw[tp - L] % P + P) % P;f[i] = 1LL * s * pw[tp + i - 1] % P;if(y[i].l == 1) f[i] = (f[i] + pw[tp + i - 1]) % P;f[i] = 1LL * f[i] * p % P; s = (s + 1LL * f[i] * pw[tp - i]) % P; ++R;if(y[i].r == m) A = (A + 1LL * f[i] * pw[tp + tp - i]) % P;}return A;
}
int main() {n = ri(); int a = ri(); ia = Pow(a, P - 2); int q = ri(); for(int i = 1;i <= q; ++i) x[i].l = ri(), x[i].r = ri();std::sort(x + 1, x + q + 1, cmp);m = 1;for(int i = 2;i <= q; ++i) {for(;x[m].r >= x[i].r;) --m;if(x[m].l < x[i].l) x[++m] = x[i];}int L = 1, R = 0;for(int i = x[1].l;i <= x[m].r; ++i) {for(;L <= R && x[L].r < i; ++L) ;for(;x[R + 1].l <= i && R < m; ++R) ;if(L <= R) y[++tp].l = L; y[tp].r = R;}int A = 0;for(int i = 1;i <= a; ++i) A = (A + 1 + P - Cal(i - 1)) % P;printf("%d\n", A);return 0;
}

luoguP3600 随机数生成器概率与期望Dp相关推荐

  1. [Luogu3600] 随机数生成器 [概率期望动态规划 拉格朗日插值离散微积分]

    [Link\frak{Link}Link] 求 E[ans=max⁡1≤i≤q(min⁡li≤j≤riaj)]\rm{E}\left[ans=\max\limits_{1\le i\le q}\lef ...

  2. BZOJ 1444 [JSOI2009]有趣的游戏 (AC自动机、概率与期望DP、矩阵乘法)

    诶这题洛谷居然没有??? 题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1444 题解: 我见到主要有两种做法. 一是矩阵乘法.设\(d ...

  3. BZOJ 3566: [SHOI2014]概率充电器 期望DP + 树形DP

    Time Limit: 40 Sec Memory Limit: 256 MB Submit: 1276 Solved: 558 Description 著名的电子产品品牌 SHOI 刚刚发布了引领世 ...

  4. 概率期望题(期望 DP)做题记录

    概率期望题(期望 DP)做题记录 P3830 [SHOI2012]随机树 难点在于第二问:生成树的期望深度. 不 wei zhuo 捏,设 \(dp_{i,j}\) 表示已经有了 \(i\) 个叶子结 ...

  5. 【loj6191】「美团 CodeM 复赛」配对游戏 概率期望dp

    题目描述 n次向一个栈中加入0或1中随机1个,如果一次加入0时栈顶元素为1,则将这两个元素弹栈.问最终栈中元素个数的期望是多少. 输入 一行一个正整数 n . 输出 一行一个实数,表示期望剩下的人数, ...

  6. 动态规划 —— 概率 DP 与期望 DP

    [概述] 由于概率和期望具有线性性质,使得可以在概率和期望之间建立一定的递推关系,这样就可以通过动态规划来解决一些概率问题,例如概率和期望的最值问题就常常使用概率 DP.期望 DP 来解决. 与其他的 ...

  7. 插头DP 概率DP / 期望DP

    插头DP && 概率DP / 期望DP 写在前面: 插头DP P5056 [模板]插头dp 手写哈希表的方法: 拉链法的代码如下: 开放寻址法的代码如下: 接下来是这道题的代码实现: ...

  8. c++产生均匀分布随机数赋值_不随机的随机数:高斯随机数生成器综述

    随机数的使用非常广泛,例如在从统计总体中抽取有代表性的样本时,或者在将实验动物分配到不同的试验组的过程中,或者在进行蒙特卡洛模拟法计算的时候等等.事实上,这些统计技术中使用的随机数均为"伪随 ...

  9. luogu P4745 [CERC2017]Gambling Guide(期望DP + 最短路实现)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P4745 [CERC2017]Gambling Guide(期望DP + 最短路实现) Weblin ...

最新文章

  1. 小白都能看懂最小生成树prime算法
  2. Linux添加环境变量
  3. how to install nc on centos8及nc应用
  4. HDFS NameNode重启优化
  5. 苹果因不附赠充电头被罚200万美元,网友:该,大快人心!
  6. Linux网络:内核中的网络参数(net.xxx.xxx)
  7. struts2学习笔记(三) Action(上)
  8. 双十一,不玩盖楼,直接大额降价!
  9. tnsnames.ora配置未生效_一文了解网络交换机的6种命令配置模式
  10. codevs 1029 遍历问题
  11. Javascript脚本之清除浏览器历史数据
  12. php时间戳转UTC时间
  13. 打造黑苹果(二)制作黑mac系统安装U盘
  14. linux编译gdal geos,GDAL编译支持GEOS
  15. 实验九:采用异步方式实现文件读/写
  16. 禅与摩托车维修艺术(2)
  17. 深入理解java虚拟机之——垃圾回收(垃圾判断,垃圾收集算法,垃圾收集器)
  18. 用html做七巧板的方法,纯HTML5绘制的七巧板
  19. 前端开发相关的学习网站
  20. 思维导图到底是什么-图说思维导图定义

热门文章

  1. 鼠标移上去触动hover致使div向上移动几个相素(动画transition轻轻的移动)
  2. 刘铁岩《良师益友》系列
  3. 解析智能抄表工作系统是如何运作的
  4. kafak学习之分享ppt
  5. Ajax数据的爬取(淘女郎为例)
  6. Webcam.getWebcamByName(“XXX“)的用法/Webcam调用摄像头的方法
  7. 使用andorid源生生成pdf的坑
  8. 服务器超时位置模拟失败,MS服务器跑DMol3任务失败,求能人分析原因! - 计算模拟 - 小木虫 - 学术 科研 互动社区...
  9. 电子词典的python3 结合网络编程项目实例源码
  10. MySQL同步到hadoop工具_MySQL数据库实时同步数据到Hadoop分布式文件系统的工具Applier(转)...