题目链接

大意

给你\(N\)个事件,解决每个事件所需的时间有\(1/2\)的概率为\(t[i]\),\(1/2\)的概率为\((t[i]+1)\),给你总时间\(T\),在\(T\)时间内按顺序解决事件,求能解决的事件的期望个数。

(答案对\(10^9+7\)取模)

(\(N\le 2\cdot 10^5,1\le t[i]\le 10^9,1\le T\le 2\cdot 10^{14}\))

思路

考虑如何求期望:

我们设\(P[i]\)表示第\(i\)件物品能被做完的概率。

则有$$Ans=\sum_{i=1}^{N}P[i]$$

则问题就转化为如何求\(P[i]\)。

我们设\(Sum[i]\)表示前\(i\)件事的最小时间和,即\(Sum[i]=\sum_{i=1}^{N}t[i]\)。

①:对于\(Sum[i]+i\le T\)的情况:

则第\(i\)件事一定会被做完,故\(P[i]=1\)。

②:对于\(Sum[i]\le T<Sum[i]+i\)的情况:

我们设\(Dp[i][j]\)表示前\(i\)件事有\(j\)件事时间多做了\(1\)个单位的概率,即多做了\(j\)个时间单位,

则对于每个\(Dp[i][j]\),若有\(Sum[i]+j<=T\),则可以对\(P[i]\)产生\(Dp[i][j]\)的贡献。

考虑如何求\(Dp[i][j]\):

将这些事件按是否多做\(1\)个时间单位分类,

若完成时间为\(t[i]\),则类型为\(0\),

若完成时间为\(t[i]+1\),则类型为\(1\),

则可以将这些事件的状态表示为一个\(01\)串。

则总状态数就为\(2^i\),从\(i\)个数中选\(j\)个让其状态为\(1\)的个数就为\(C(i,j)\),

则\(Dp[i][j]=\frac{C(i,j)}{2^i}\)。

对于每个\(P[i]\),

我们倘若每次都去枚举有哪些\(j\)是可以满足\(Sum[i]+j<=T\)的话,很明显会超时。

则考虑如何从上一次\((P[i-1])\)所需的状态数转到\(P[i]\)的状态数。

(注:第一次进入情况②的时候可以暴力找到状态)

考虑如何快速地从\(P[i-1]\)转移到\(P[i]\)的状态:

我们设上一次需要的\(C\)是从\(C(i-1,0)\)到\(C(i-1,Sum_K)\),

设上一次的\(P[i-1]=\frac{Sum_N}{2^{i-1}}\),则有\(Sum_N=\sum_{j=0}^{Sum_K}C(i-1,j)\)。

根据$$C(i,j)=C(i-1,j)+C(i-1,j-1)$$

则有$$\sum_{j=1}{Sum_K}C(i,j)=\sum_{j=1}{Sum_K}(C(i-1,j)+C(i-1,j-1))$$

则$$\sum_{j=1}{Sum_K}C(i,j)=(2*\sum_{j=0}{Sum_K}C(i-1,j))-C(i-1,0)-C(i-1,Sum_K)$$

然后,对于这次的\(Sum_N\)来说,

\(Sum_N=\sum_{j=1}^{Sum_K}C(i,j)+C(i,0)-\sum_{j=T-Sum[i]+1}^{Sum_K}C(i,j)\)

\(Sum_N=(2*\sum_{j=0}^{Sum_K}C(i-1,j))-C(i-1,Sum_K)-\sum_{j=T-Sum[i]+1}^{Sum_K}C(i,j)\)

\(Sum_N=Sum_N*2-C(i-1,Sum_K)-\sum_{j=T-Sum[i]+1}^{Sum_K}C(i,j)\)

则这一次的\(Sum_N\)就可以从上一次的\(Sum_N\)转移过来。

显然这一次的\(Sum_K=T-Sum[i]\)。

则\(Sum_K\)会随着\(i\)的增大而减小,

而进入情况②的条件是:\(Sum[i]<=T<Sum[i]+i\),

即求解所有的\(Sum_N\)的时间复杂度总计\(O(N)\)。

③:\(Sum[i]>T\)时

则事件\(i\)一定不会被做完,即\(P[i]=0\)。

综上,\(Ans\)得解。

代码

#include<cstdio>
#include<algorithm>
using namespace std;
#define LL long long
const int ON=200000;
const int MAXN=200005;
const long long ONE=1;
const int MOD=1000000007;
int N,t[MAXN];
long long F[MAXN];
long long T,Sum[MAXN],Ans;
long long f[MAXN]={1},fe[MAXN]={1};
long long O[MAXN]={1},Oe[MAXN]={1};
long long Sum_N,Sum_K;
LL quick_Pow(LL x,LL y){
if(y==0)return 1;
if(y==1)return x;
if(y%2)return (x*quick_Pow((x*x)%MOD,y/2))%MOD;
return quick_Pow((x*x)%MOD,y/2);
}
void Prepare(){
for(int i=1;i<=ON;i++){
f[i]=(f[i-1]*i)%MOD;
fe[i]=quick_Pow(f[i],MOD-2);
O[i]=(O[i-1]*2)%MOD;
Oe[i]=quick_Pow(O[i],MOD-2);
}
}
long long C(long long x,long long y){
if(y>x)return 0;
return (f[x]*((fe[y]*fe[x-y])%MOD))%MOD;
}
long long work(long long n,long long k){
if(Sum_K==0){
for(int i=0;i<=k;i++)
Sum_N=(Sum_N+C(n,i))%MOD;
}else{
Sum_N=(Sum_N*2-C(n-1,Sum_K)+MOD)%MOD;
for(int i=Sum_K;i>k;i--)
Sum_N=(Sum_N-C(n,i)+MOD)%MOD;
}
Sum_K=k;
return Sum_N;
}
int main(){
Prepare();
scanf("%d%lld",&N,&T);
for(int i=1;i<=N;i++){
scanf("%d",&t[i]);
Sum[i]=Sum[i-1]+t[i];
}
for(int i=1;i<=N;i++){
if(Sum[i]>T)break;
if(Sum[i]+i<=T){
F[i]=1;
continue;
}
F[i]=(work(i,T-Sum[i])*Oe[i])%MOD;
}
for(int i=1;i<=N;i++)
Ans=(Ans+F[i])%MOD;
printf("%lld\n",Ans);
}

【CF1194F】Crossword Expert(数学 期望)的更多相关文章

  1. CF1194F Crossword Expert(数论,组合数学)

    不难的一题.不知道为什么能 $2500$…… 不过场上推错了一直不会优化…… 首先考虑 $f_i$ 表示恰好做完前 $i$ 道题的概率. 这样很难算.修改一下,$f_i$ 表示做完至少 $i$ 道题的 ...

  2. [BZOJ 3143][HNOI2013]游走(数学期望)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3143 分析: 易得如果知道了每条边经过的数学期望,那就可以贪心着按每条边的期望的大小赋 ...

  3. Codeforces Round #259 (Div. 2) C - Little Pony and Expected Maximum (数学期望)

    题目链接 题意 : 一个m面的骰子,掷n次,问得到最大值的期望. 思路 : 数学期望,离散时的公式是E(X) = X1*p(X1) + X2*p(X2) + …… + Xn*p(Xn) p(xi)的是 ...

  4. 数学期望和概率DP题目泛做(为了对应AD的课件)

    题1: Uva 1636 Headshot 题目大意: 给出一个000111序列,注意实际上是环状的.问是0出现的概率大,还是当前是0,下一个还是0的概率大. 问题比较简单,注意比较大小: A/C & ...

  5. [2013山东ACM]省赛 The number of steps (可能DP,数学期望)

    The number of steps nid=24#time" style="padding-bottom:0px; margin:0px; padding-left:0px; ...

  6. 【BZOJ2134】单位错选(数学期望,动态规划)

    [BZOJ2134]单位错选(数学期望,动态规划) 题面 BZOJ 题解 单独考虑相邻的两道题目的概率就好了 没了呀.. #include<iostream> #include<cs ...

  7. 【BZOJ1415】【NOI2005】聪聪和可可(动态规划,数学期望)

    [BZOJ1415][NOI2005]聪聪和可可(动态规划,数学期望) 题面 BZOJ 题解 先预处理出当可可在某个点,聪聪在某个点时 聪聪会往哪里走 然后记忆化搜索一下就好了 #include< ...

  8. 【Luogu1291】百事世界杯之旅(动态规划,数学期望)

    [Luogu1291]百事世界杯之旅(动态规划,数学期望) 题面 洛谷 题解 设\(f[i]\)表示已经集齐了\(i\)个名字的期望 现在有两种方法: 先说我自己的: \[f[i]=f[i-1]+1+ ...

  9. 【BZOJ4872】分手是祝愿(动态规划,数学期望)

    [BZOJ4872]分手是祝愿(动态规划,数学期望) 题面 BZOJ 题解 对于一个状态,如何求解当前的最短步数? 从大到小枚举,每次把最大的没有关掉的灯关掉 暴力枚举因数关就好 假设我们知道了当前至 ...

随机推荐

  1. 详解Scrapy的命令行工具

    接触过Scrapy的人都知道,我们很多操作是需要借助命令行来执行的,比如创建项目,运行爬虫等.所以了解和掌握这些命令对于scrapy的学习是很有帮助的! Scrapy 命令 首先,在scrapy命令中 ...

  2. GDB基础知识

    GDB 基础知识 GDB 基础知识 一.简介 支持命令补全功能 GDB 的调用与退出 二.GDB 的基本指令 1. run/r 2. break/b 3. info breakpoints 4. de ...

  3. SYCOJ2197三角形游戏

    题目-三角形游戏 (shiyancang.cn) 对于任意的一个数字,把他拆分为n个数字,使得其逐层和为该数字. 首先n很小,所以很可能是搜索.DFS,n回选择. #include<bits/s ...

  4. spring源码之refresh第二篇

    大家好,我是程序员田同学 上篇文章对spring核心启动方法refresh做了整体的解读,但是只是泛泛而谈,接下来会出一系统文章对每个方法的源码进行深刻解读. 第一篇文章见 spring源码之方法概览 ...

  5. 【洛谷】P1067 多项式输出

    原题链接:P1067 多项式输出 题目分析:学长推荐的OJ网站 --洛谷,发现挺好用的还可以下载提交出错的数据. 废话就不多说了,这道题属于基础题.提交出错主要是因为一些小细节不到位,这里就不一一赘述 ...

  6. 《剑指offer》面试题20. 表示数值的字符串

    问题描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100"."5e2"."-123"."3.1 ...

  7. 什么是XSS攻击?什么是SQL注入攻击?什么是CSRF攻击?

    1. XSS(Cross Site Script,跨站脚本攻击) 是向网页中注入恶意脚本在用户浏览网页时在用户浏览器中执行恶意脚本的攻击方式. 1.1跨站脚本攻击分有两种形式: 反射型攻击(诱使用户点 ...

  8. pytest文档6-allure-pytest

    allure-pytest 环境准备 windows环境相关: python 3.6版本pytest 4.5.0版本allure-pytest 2.8.6 最新版 使用pip安装pytest和allu ...

  9. 《手把手教你》系列技巧篇(六十一)-java+ selenium自动化测试 - 截图三剑客 -下篇(详细教程)

    1.简介 按照计划宏哥今天将介绍java+ selenium自动化测试截图操作实现的第三种截图方法,也就是截图的第三剑客 - 截取某个元素(或者目标区域)的图片.在测试的过程中,有时候不需要截取整个屏 ...

  10. HMS Core 6.3.0 版本发布公告

    新增内容风控检测,若用户输入内容不符合国家法律法规要求,风控将会拦截,无法翻译手语动作. 查看详情>> 新增受众同步至HUAWEI Ads功能,实现精准投放高价值用户,提升广告效率: 新增 ...