[luogu3600]随机数生成器
题面在这里
题意
给定n个[1-x]的随机整数\(a_1,a_2,a_3,...,a_n\)和q个询问区间\((l_i,r_i)\),
求出\(\max_{i=1}^{q}({\min_{j=l_i}^{r_i}{a_j})}\)的期望
对于10%的数据,\(n,x,q≤6\)。
对于另外20%的数据,\(q=1\)。
对于50%的数据,\(n,x,q≤300\)。
对于100%的数据,\(1≤n,x,q≤2000\),对于每个i,\(1≤li≤ri≤n\)。
sol
又是一道期望大火题
又一次去看题解(我怎么这么菜)
套路1:区间排序和去重
考虑两个区间\([l1,r1]\)和\([l2,r2]\),其中\(l1\geq l2\geq r2 \geq r1\),那么有\(min[l1,r1]\leq min[l2,r2]\),
因此,如果大区间覆盖率小区间,那么大区间对于期望就根本没有贡献(因为小区间的\(min\)总是会大于大区间),经过一番排序和去重之后可以得到若干个\(l\)和\(r\)都单调递增的区间,这里的区间个数记为\(tot\)
q=1
接下来我们思考每个询问的结果和最后答案的关系
一个询问区间中只要有一个数 \(\leq x\),那么这个区间的答案都会\(\leq x\);
如果每个询问区间的答案都\(\leq x\),那么最后的最大值就会\(\leq x\)
于是我们可以通过各种组合乱搞来满足上面的需求,
得到单个询问区间结果\(\leq x\)的概率\(P(ans\leq x)\)
当q=1的时候\(\sum_{i=1}^{i=x}{(P(ans\leq i)-P(ans\leq i-1))*i}\)就是答案啦
并且根据上面的式子我们可以继续往下推出
一个重要的公式
对于一个随机正整数变量\(k\geq 0\),其期望
\]
update 3.27:其实就是一个差分嘛
考虑暴力求出\(P(k \geq i)\)
按照上面的思路,一个更好的做法是求出\(P(k\leq i-1)\)那么其实
\]
(因为\(P(k\leq x)==1\))
于是对于每一个\(P(k\leq x)\)我们暴力计算
套路2:考虑单个元素贡献(n,x,q≤300)
需要转换一下思路:考虑每一个数\(a_i\)能满足哪些区间
由于我们之前已经对区间进行了去重和排序,
那么我们可以知道,每个元素所在的询问集合一定是一个连续的区间
意即只要这一个元素\(\leq i\),那么这个元素所在的询问集合的取值都会\(\leq i\);
而我们需要用某些元素满足所有的询问
因此这个问题转换成了一个区间覆盖问题:
我们有\(n\)个区间(\(n\)个元素各对应一个询问集合),每个询问区间有\(p=P(k\leq i)=\frac{i}{x}\)的概率被取到,求整段\([1-q]\)被覆盖的概率
于是我们可以设置状态\(f[i]\)表示强制选择第\(i\)个区间,并且选择区间集合包含了前\(i\)个区间的右端点的概率,则
\]
最后$$Ans=\sum_{i=1,r[i]==n}{n}{(f[i]\times(1-p){n-i})}$$
然而这个转移是\(O(n^2)\)的有木有!!!
其实有另一种更简单的50分做法,由于跟正解关系不大故不做赘述
最后的DP优化:单调指针/前缀和(1≤n,x,q≤2000)
可以看出我们每次需要O(n)计算的一大段\(\sum_{j,r[j]>=l[i]-1}^{i-1}{f[j]\times(1-p)^{i-j-1}}\)其实是一段连续并且左端点和右端点均单调不降的
因此使用单调指针记录这个值即可,一次DP的复杂度降为\(O(n)\)
update 3.27:直接记录一个前缀和就可以啦!!!
总复杂度\(O(nx)\)
代码
#include<bits/stdc++.h>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<iomanip>
#include<cstring>
#include<vector>
#include<cstdio>
#include<string>
#include<bitset>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define pb push_back
#define RG register
#define il inline
using namespace std;
const int mod=666623333;
const int N=2010;
typedef unsigned long long ull;
typedef vector<int>VI;
typedef long long ll;
typedef double dd;
il ll read(){
RG ll data=0,w=1;RG char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(ch<='9'&&ch>='0')data=data*10+ch-48,ch=getchar();
return data*w;
}
il ll poww(ll a,ll b){
a=(a%mod+mod)%mod;RG ll ret=1;
for(;b;b>>=1,a=a*a%mod)if(b&1)ret=ret*a%mod;
return ret;
}
il ll fac(ll x){if(!x)return 1;return fac(x-1)*x%mod;}
int tot,cnt;
struct line{int l,r;}T[N],Q[N],L[N];
bool cmp(line a,line b){return a.l==b.l ? a.r<b.r : a.l<b.l;}
int n,x,q,ans;
il void init(){
n=read();x=read();q=read();
for(RG int i=1;i<=q;i++){T[i].l=read();T[i].r=read();}
sort(T+1,T+q+1,cmp);
for(RG int i=1;i<=q;i++){
while(Q[tot].r>=T[i].r&&tot)tot--;
if(Q[tot].l<T[i].l&&Q[tot].r<T[i].r)Q[++tot]=T[i];
}
for(RG int i=Q[1].l,pl=1,pr=0;i<=n;i++){
while(Q[pl].r<i&&pl<=tot)pl++;
while(Q[pr+1].l<=i&&pr!=tot)pr++;
L[++cnt]=(line){pl,pr};
}
}
int f[N];
il int calc(int a){
RG int p=1ll*(a-1)*poww(x,mod-2)%mod,sum=0;
RG int fp=(1-p+mod)%mod,revfp=poww(fp,mod-2);
memset(f,0,sizeof(f));
for(RG int i=1,l=1,r=0,S=0,k=0;i<=cnt;i++){
if(L[i].l==1)f[i]=poww(fp,i-1);
while(L[r+1].r>=L[i].l-1&&r+1<i)
r++,S=(S+1ll*f[r]*poww(fp,cnt-r-1)%mod)%mod;
while(L[l].r<L[i].l-1&&l<r)
S=(S-1ll*f[l]*poww(fp,cnt-l-1)%mod+mod)%mod,l++;
f[i]=1ll*(f[i]+1ll*S*poww(revfp,cnt-i)%mod)%mod*p%mod;
}
for(RG int i=1;i<=cnt;i++)
if(L[i].r==tot)
sum=(sum+1ll*f[i]*poww(1-p+mod,cnt-i)%mod)%mod;
return sum;
}
il void solve(){
for(RG int i=1;i<=x;i++)
ans=(ans+(1-calc(i)+mod))%mod;
printf("%d\n",ans);
}
int main()
{
init();
solve();
return 0;
}
[luogu3600]随机数生成器的更多相关文章
- 【原创】开源Math.NET基础数学类库使用(13)C#实现其他随机数生成器
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...
- 【BZOJ-3122】随机数生成器 BSGS
3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1362 Solved: 531[Submit][Sta ...
- BZOJ-2875 随机数生成器 矩阵乘法快速幂+快速乘
题目没给全,吃X了... 2875: [Noi2012]随机数生成器 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 1479 Solved: 829 ...
- [BZOJ3671][UOJ#6][NOI2014]随机数生成器
[BZOJ3671][UOJ#6][NOI2014]随机数生成器 试题描述 小H最近在研究随机算法.随机算法往往需要通过调用随机数生成函数(例如Pascal中的random和C/C++中的rand)来 ...
- NOI2014 随机数生成器
随机数生成器 [问题描述] 小H最近在研究随机算法.随机算法往往需要通过调用随机数生成函数(例如Pascal中的random和C/C++中的rand)来获得随机性.事实上,随机数生成函数也并不是真正的 ...
- 【BZOJ 3122】 [Sdoi2013]随机数生成器 (BSGS)
3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1442 Solved: 552 Description ...
- Linux下对拍脚本与随机数生成器
对拍脚本 新建一个文档 check.sh 作为对拍脚本. #!/bin/bash while(true)do #死循环 ./data > .in #运行数据生成器,将数据输出到1.in ./st ...
- 矩阵(快速幂):COGS 963. [NOI2012] 随机数生成器
963. [NOI2012] 随机数生成器 ★★ 输入文件:randoma.in 输出文件:randoma.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] 栋 ...
- 解密随机数生成器(二)——从java源码看线性同余算法
Random Java中的Random类生成的是伪随机数,使用的是48-bit的种子,然后调用一个linear congruential formula线性同余方程(Donald Knuth的编程艺术 ...
随机推荐
- 【mysql】 操作 收集持续更新
一个字段可能对应多条数据,用mysql实现将多行数据合并成一行数据 GROUP_CONCAT(Name SEPARATOR ',') 需注意: 1.GROUP_CONCAT()中的值为你要合并的数据的 ...
- 二叉排序树、平衡二叉树、B树&B+树、红黑树的设计动机、缺陷与应用场景
之前面试时曾被问到"如果实现操作系统的线程调度应该采用什么数据结构?",因为我看过ucore的源码,知道ucore是采用斜堆的方式实现的,可以做到O(n)的插入.O(1)的查找.我 ...
- tf.variable和tf.get_Variable以及tf.name_scope和tf.variable_scope的区别
在训练深度网络时,为了减少需要训练参数的个数(比如具有simase结构的LSTM模型).或是多机多卡并行化训练大数据大模型(比如数据并行化)等情况时,往往需要共享变量.另外一方面是当一个深度学习模型变 ...
- UVA - 11270 轮廓线DP
其实这题还能用状压DP解决,可是时间达到2000ms只能过掉POJ2411.状压DP解法详见状压DP解POJ2411 贴上POJ2411AC代码 : 2000ms 时间复杂度h*w*(2^w)*(2^ ...
- Codeforces446C - DZY Loves Fibonacci Numbers
Portal Description 给出一个\(n(n\leq3\times10^5)\)个数的序列,进行\(m(m\leq3\times10^5)\)次操作,操作有两种: 给区间\([L,R]\) ...
- ThreadLoacl,InheritableThreadLocal,原理,以及配合线程池使用的一些坑
虽然使用AOP可以获取方法签名,但是如果要获取方法中计算得出的数据,那么就得使用ThreadLocal,如果还涉及父线程,那么可以选择InheritableThreadLocal. 注意:理解一些原理 ...
- 用pycharm+flask 建立项目以后运行出现ImportError: No module named flask-login问题
出现此问题,一般情况下: 打开CMD输入: pip install flask-login 然后,在cmd中输入命令: pip list 查看目前已安装的的模板.在此时,如果你继续运行项目,有可能会发 ...
- Tomcat重定向
tomcat默认情况下不带www的域名是不会跳转到带www的域名的,而且也无法像apache那样通过配置.htaccess来实现.如果想要把不带"www'的域名重定向到带"www& ...
- ACL访问控制列表
acl是基于文件系统的,所以支不支持acl在于使用什么文件系统. FAT32文件系统不支持权限,也不区分大小写 如果一个分区不是安装系统时分的分区,是一个新的分区的话,默认是不支持acl CentOS ...
- 通过Activity动态加载Fragment创建主界面构架
在做项目中,需要建立一个主界面框架,尝试过使用ViewPager ,后来又换成了使用Activity动态加载Fragment实现选项卡的效果.总结一下方便以后回顾. 先给出总体效果: 要实现上述效果, ...