题目链接:Problem - 1194F - Codeforces

题意:

你有 n 个题目 t 秒时间,每个题目需要消耗时间 ai​ 秒。

但你有0.5的概率消耗多 1 秒,问从 1 开始依次向后做,t 秒能做出题目数的期望值。

分析:

首先暴力的做法很容易想到:

f[u]=(f[u]+dp(u+1,T-a[u]-1)*inv)%MOD;

但很显然是会T的,想到了前几天的一道组合数的题Problem - E - Codeforces感觉可以借鉴一下,我们发现很难求出做了i道题的概率,但是至少做i道题的概率还是相对容易一些的,我们求一下前i道题用时的前缀和s[i],显然可以有min(t-s[i],i)次+1秒的机会,令F(n,m)表示 ,实际上至少做出i道题的概率为,那么做出i道题的概率为ans[i]-ans[i+1],正要准备开写的时候突然发现时间复杂度为,还是会T。试着从F(n,m)着手,发现min(t-s[i],i)是个单峰函数,当t-s[i]<i时是单调递增的,t-s[i]>i时是单调递减的,此时便可以利用上一次的F(n,m)推出此处F(n+1,m),利用公式可优化一维复杂度。

#include<bits/stdc++.h>
#define x first
#define y second
#define endl '\n'
#define LL long long
#define ios ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
using namespace std;
const int N=200010,MOD=1e9+7;
typedef pair<int,int> PII;
LL n,t,a[N],res,s[N],ans[N];
LL qpow(LL a,LL b){LL res=1;while(b>0){if(b&1)  res=res*a%MOD;a=a*a%MOD;b>>=1;}return res;
}
LL f[N],invf[N],fact[N],inv[N];
void init(){  invf[0]=fact[0]=inv[1]=1;  for(int i=2;i<=N-10;i++){  inv[i]=(MOD-MOD/i)*inv[MOD%i];  inv[i]=inv[i]%MOD;  }  for(int i=1;i<=N-10;i++){  fact[i]=(LL)fact[i-1]*i%MOD;  invf[i]=(LL)invf[i-1]*inv[i]%MOD;  }
}
LL C(LL a,LL b){  return fact[a]*invf[a-b]%MOD*invf[b]%MOD;
}
int main()
{ios;init();cin>>n>>t;for(int i=1;i<=n;i++){cin>>a[i];s[i]=s[i-1]+a[i];}LL sum=1,cur=0;for(int i=1;i<=n;i++){if(s[i]>t) break;LL m=min(t-s[i],(LL)i);sum=(sum+sum-C(i-1,cur))%MOD;while(cur<m){sum=(sum+C(i,cur+1))%MOD;++cur;}while(cur>m){sum=(sum-C(i,cur))%MOD;--cur;}ans[i]=sum*qpow(inv[2],i)%MOD;}for(int i=1;i<=n;i++){res=(res+(ans[i]-ans[i+1]+MOD)%MOD*i%MOD)%MOD;}cout<<res<<endl;
}

F. Crossword Expert相关推荐

  1. linux 重建ext4分区表,Linux 格式化U盘为ext4格式以及修复分区表方法

    1.首先执行sudo fdisk -l查看你的u盘的序号,通常是/dev/sdb之类的,U盘分区通常是/dev/sdb1 2.针对将要格式化的分区执行sudo umount  /dev/sdb1# 必 ...

  2. Linux 格式化U盘为ext4格式以及修复分区表方法

    1.首先执行sudo fdisk -l查看你的u盘的序号,通常是/dev/sdb之类的,U盘分区通常是/dev/sdb1 2.针对将要格式化的分区执行sudo umount  /dev/sdb1 # ...

  3. Linux Command fdisk 磁盘分区

    Linux Command fdisk tags: lvm 文章目录 Linux Command fdisk 1. 简介 2. fdisk -l 查看磁盘分区 2.1 fdisk -l 数值说明 2. ...

  4. F#探险之旅(三):命令式编程(上)

    F#系列随笔索引页面 在本系列的第二部分(函数式编程上.中.下)中,我们了解了如何使用F#进行纯粹的函数式编程.但是在一些情况下,比如I/O,几乎不能避免改变状态,也就是说会带来side effect ...

  5. F#探险之旅(四):面向对象编程(中)

    F#系列随笔索引 对象表达式(Object Expressions) F#中的OOP语法很简洁,而对象表达式则正是这种简洁性的核心所在.通过对象表达式,我们可以创建抽象类或接口的轻量级实现,也可以对一 ...

  6. 总结一下F#中运算符的定义规则

    F#允许开发人员定义或重载各类运算符,合理利用这一规则可以让编程变得方便,让代码更容易阅读.例如,在使用F#的MailboxProcessor的时候,我会习惯于定义一个运算符来代替显式的Post操作: ...

  7. elisa标准曲线怎么做_Curve Expert软件绘制ELISA标准曲线流程 | 每日生物评论

    摘要 毫无疑问,绘制ELISA标准曲线是科研者在ELISA定量测定中需具备的技能,今天就手把手教你使用Curve Expert软件绘制ELISA标准曲线. ELISA操作步骤复杂,影响反应因素较多,特 ...

  8. INTRODUCING F#

    第一篇,从零开始编写我们的第一个F#程序. 什么是F#,我为何要学它? F#是一种.NET平台上的函数式编程语言.就像C#和VB.NET,F#可以利用.NET的核心类库,如WPF,WCF,VSTO等等 ...

  9. sqlite expert 教程

    SQLite Database SQLite is an embedded relational database engine. Its developers call it a self-cont ...

最新文章

  1. NOIP模拟 蛋糕(DP+Dilworth定理)
  2. Google 工程师:为什么 CDN 对移动客户端加速“没有”效果
  3. 【数据结构与算法】之深入解析“删除有序数组中的重复项”与“移除元素”的求解思路与算法示例
  4. java hanlp分词_Hanlp分词实例:Java实现TFIDF算法
  5. aes js 加盐值 解密_Java已有AES加解密,现需要前端Javascript加密调接口,返回的数据需要解密,目前互..._慕课猿问...
  6. 如何部署同一个Spring boot web 应用到不同的环境
  7. 文本编码与解码问题解决方案
  8. 高精度运算一(两个数的运算)
  9. [asp.net mvc 奇淫巧技] 06 - 也许你的项目同一个用户的请求都是同步的
  10. 如何下载自己喜欢的网站
  11. 学习笔记(26):NumPy数据分析-NumPy 统计函数-var方差
  12. 冰冻三尺非一日之寒——大型网站架构演进
  13. 计算机课程之间的关系
  14. 163免费邮件群发平台,企业群发邮件的哪个好?企业邮件群发助手
  15. Tony Stark
  16. 交大研究生去日本签证攻略
  17. tensorflow 机器学习资料及其工具库
  18. 深度学习中mAP的含义
  19. iphonex时间显示蓝色_一文了解显示技术的发展简史
  20. 【天梯赛 - L2习题集】啃题(12 / 44)

热门文章

  1. 服务器修改拔刀剑修改数,关于拔刀剑的(求助大佬!)
  2. routeros php插件,MikroTik RouterOS U盘安装工具netinstall的使用
  3. farpoint 小数保留4位_FarPoint FpSpread控件的使用心得2
  4. python微课教学_Python课程设计-微课视频版
  5. mac怎么把m4a转换成mp3?
  6. 大数据Hadoop生态圈介绍
  7. keras离线下载模型的存储位置
  8. Redis持久化之RDB原理
  9. 区块链电商=电商+社群?
  10. TP5.1 实现超时未支付订单自动关闭