F. Crossword Expert
题目链接: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相关推荐
- linux 重建ext4分区表,Linux 格式化U盘为ext4格式以及修复分区表方法
1.首先执行sudo fdisk -l查看你的u盘的序号,通常是/dev/sdb之类的,U盘分区通常是/dev/sdb1 2.针对将要格式化的分区执行sudo umount /dev/sdb1# 必 ...
- Linux 格式化U盘为ext4格式以及修复分区表方法
1.首先执行sudo fdisk -l查看你的u盘的序号,通常是/dev/sdb之类的,U盘分区通常是/dev/sdb1 2.针对将要格式化的分区执行sudo umount /dev/sdb1 # ...
- Linux Command fdisk 磁盘分区
Linux Command fdisk tags: lvm 文章目录 Linux Command fdisk 1. 简介 2. fdisk -l 查看磁盘分区 2.1 fdisk -l 数值说明 2. ...
- F#探险之旅(三):命令式编程(上)
F#系列随笔索引页面 在本系列的第二部分(函数式编程上.中.下)中,我们了解了如何使用F#进行纯粹的函数式编程.但是在一些情况下,比如I/O,几乎不能避免改变状态,也就是说会带来side effect ...
- F#探险之旅(四):面向对象编程(中)
F#系列随笔索引 对象表达式(Object Expressions) F#中的OOP语法很简洁,而对象表达式则正是这种简洁性的核心所在.通过对象表达式,我们可以创建抽象类或接口的轻量级实现,也可以对一 ...
- 总结一下F#中运算符的定义规则
F#允许开发人员定义或重载各类运算符,合理利用这一规则可以让编程变得方便,让代码更容易阅读.例如,在使用F#的MailboxProcessor的时候,我会习惯于定义一个运算符来代替显式的Post操作: ...
- elisa标准曲线怎么做_Curve Expert软件绘制ELISA标准曲线流程 | 每日生物评论
摘要 毫无疑问,绘制ELISA标准曲线是科研者在ELISA定量测定中需具备的技能,今天就手把手教你使用Curve Expert软件绘制ELISA标准曲线. ELISA操作步骤复杂,影响反应因素较多,特 ...
- INTRODUCING F#
第一篇,从零开始编写我们的第一个F#程序. 什么是F#,我为何要学它? F#是一种.NET平台上的函数式编程语言.就像C#和VB.NET,F#可以利用.NET的核心类库,如WPF,WCF,VSTO等等 ...
- sqlite expert 教程
SQLite Database SQLite is an embedded relational database engine. Its developers call it a self-cont ...
最新文章
- NOIP模拟 蛋糕(DP+Dilworth定理)
- Google 工程师:为什么 CDN 对移动客户端加速“没有”效果
- 【数据结构与算法】之深入解析“删除有序数组中的重复项”与“移除元素”的求解思路与算法示例
- java hanlp分词_Hanlp分词实例:Java实现TFIDF算法
- aes js 加盐值 解密_Java已有AES加解密,现需要前端Javascript加密调接口,返回的数据需要解密,目前互..._慕课猿问...
- 如何部署同一个Spring boot web 应用到不同的环境
- 文本编码与解码问题解决方案
- 高精度运算一(两个数的运算)
- [asp.net mvc 奇淫巧技] 06 - 也许你的项目同一个用户的请求都是同步的
- 如何下载自己喜欢的网站
- 学习笔记(26):NumPy数据分析-NumPy 统计函数-var方差
- 冰冻三尺非一日之寒——大型网站架构演进
- 计算机课程之间的关系
- 163免费邮件群发平台,企业群发邮件的哪个好?企业邮件群发助手
- Tony Stark
- 交大研究生去日本签证攻略
- tensorflow 机器学习资料及其工具库
- 深度学习中mAP的含义
- iphonex时间显示蓝色_一文了解显示技术的发展简史
- 【天梯赛 - L2习题集】啃题(12 / 44)