\(\\\)

\(Description\)


一共进行\(N\)次操作,生成一个长度为\(N\)的\(01\)序列,成功对应\(1\),失败对应\(0\),已知每一次操作的成功率\(p_i\)。

在这个序列中连续且极长的\(X\)个\(1\)可以贡献\(X^2\)的分数,求期望总分。

  • \(N\in [1,10^5]\)

\(\\\)

\(Solution\)


  • 考虑增量的思路很可以啊。长度平方的期望并不等于期望长度的平方。所以需要直接考虑长度平方的期望变化。

  • 当长度从\(X\)增加到\(X+1\),\(\Delta X^2=(X+1)^2-X^2=2X+1\),所以维护答案只需要考虑长度的期望。

  • 考虑一次的答案期望\(x_1[i]\)表示到第\(i\)个位置为止的长度期望,有\(x_1[i]=(x_1[i-1]+1)\times p_i\),代表继承上一个为止的期望长度会\(+1\),但保证第\(i\)位合法,需要乘上\(p_i\)。

  • 然后到第\(i\)个位置的平方期望就可以转移自第\(i-1\)个位置,注意增量是有概率的。

    \[ans[i]=ans[i-1]+(2x_1[i]+1)\times p_i
    \]

\(\\\)

\(Code\)


#include<cmath>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 300010
#define R register
#define gc getchar
using namespace std; int n;
double p[N],x1[N],ans[N]; inline double calc(char x){
return x=='x'?0.0:(x=='o'?1.0:0.5);
} int main(){
scanf("%d",&n);
char c=gc();
while(c!='o'&&c!='x'&&c!='?') c=gc();
p[1]=calc(c);
for(R int i=2;i<=n;++i) p[i]=calc(gc());
for(R int i=1;i<=n;++i){
x1[i]=(x1[i-1]+1)*p[i];
ans[i]=ans[i-1]+(x1[i-1]*2+1)*p[i];
}
printf("%.4lf",ans[n]);
return 0;
}

\(\\\)

\(Extra\)


得分改为\(X^3\),求分数的期望。

\(\\\)

\(Solution\)


  • 同样考虑增量,有\(\Delta X^3=(X+1)^3-X^3=X^3+3X^2+3X+1-X^3=3X^2+3X+1\)

  • 于是维护\(x_1[i]\)代表长度的期望,\(x_2[i]\)表示长度平方的期望,有:

    \[x_1[i]=(x_1[i-1]+1)\times p_i
    \]

    \[x_2[i]=x_2[i-1]+2x_1[i]+1\times p_i
    \]

  • 更新答案方式相同,有\(ans[i]=ans[i-1]+(3x_2[i]+3x_1[i]+1)\times p_i\)。

  • 解释一下\(ans[i-1]\)的部分,它代表的是前一位置的答案,这一位置是否对答案有贡献是有概率的,而增量是后面括起来的部分。

\(\\\)

\(Code\)


#include<cmath>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 100010
#define R register
#define gc getchar
using namespace std; inline int rd(){
int x=0; bool f=0; char c=gc();
while(!isdigit(c)){if(c=='-')f=1;c=gc();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();}
return f?-x:x;
} inline double rdd(){
double x=0,base=1; bool f=0; char c=gc();
while(!isdigit(c)){if(c=='-')f=1;c=gc();}
while(isdigit(c)){x=x*10+(c^48);c=gc();}
if(c=='.'){
c=gc();
while(isdigit(c)){x+=(base/=10)*(c^48);c=gc();}
}
return f?-x:x;
} int n;
double p[N],x1[N],x2[N],ans[N]; int main(){
n=rd();
for(R int i=1;i<=n;++i) p[i]=rdd();
for(R int i=1;i<=n;++i){
x1[i]=(x1[i-1]+1)*p[i];
x2[i]=(x2[i-1]+x1[i-1]*2+1)*p[i];
ans[i]=ans[i-1]+(x2[i-1]*3+x1[i-1]*3+1)*p[i];
}
printf("%.1lf",ans[n]);
return 0;
}

[ BZOJ 4318 & 3450 / CodeForces 235 B ] OSU!的更多相关文章

  1. [codeforces 235]A. LCM Challenge

    [codeforces 235]A. LCM Challenge 试题描述 Some days ago, I learned the concept of LCM (least common mult ...

  2. BZOJ 4318: OSU! 期望DP

    4318: OSU! 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4318 Description osu 是一款群众喜闻乐见的休闲软件 ...

  3. codeforces 235 B. Let's Play Osu!

    You're playing a game called Osu! Here's a simplified version of it. There are n clicks in a game. F ...

  4. ●BZOJ 4318 OSU!

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4318题解: 期望dp 如果我们能够得到以每个位置结尾形成的连续1的长度的相关期望,那么问题就 ...

  5. BZOJ 4318 OSU!(概率DP)

    题意 osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: 一共有n次操作,每次操作只有成功与失败之分,成功对应1,失败对应0,n次操作对应为1个长度为n的01串.在 ...

  6. bzoj 4318 OSU! - 动态规划 - 概率与期望

    Description osu 是一款群众喜闻乐见的休闲软件.  我们可以把osu的规则简化与改编成以下的样子:  一共有n次操作,每次操作只有成功与失败之分,成功对应1,失败对应0,n次操作对应为1 ...

  7. BZOJ - 4318: OSU! (期望DP&Attention)

    Description osu 是一款群众喜闻乐见的休闲软件.  我们可以把osu的规则简化与改编成以下的样子:  一共有n次操作,每次操作只有成功与失败之分,成功对应1,失败对应0,n次操作对应为1 ...

  8. BZOJ 4318: OSU! 期望概率dp && 【BZOJ3450】【Tyvj1952】Easy 概率DP

    这两道题是一样的...... 我就说一下较难的那个 OSU!: 这道15行的水题我竟然做了两节课...... 若是f[i][0]=(1-p)*f[i-1][0]+(1-p)*f[i-1][1],f[i ...

  9. OSU!(bzoj 4318)

    Description osu 是一款群众喜闻乐见的休闲软件.  我们可以把osu的规则简化与改编成以下的样子:  一共有n次操作,每次操作只有成功与失败之分,成功对应1,失败对应0,n次操作对应为1 ...

随机推荐

  1. Windows学习总结(10)——Windows系统中常用的CMD命令详解

    1.ping命令 ping是电脑网络故障诊断中的常用的命令,它的作用是用来检查网络是否通畅或者网络连接速度.我们来看一下PING命令的具体表述. 日常的诊断过程中我们最常用到的就是诊断连接是否通畅. ...

  2. 有一张表里面有上百万的数据,在做查询的时候,如何优化?从数据库端,java端和查询语句上回答

    原文:https://www.2cto.com/database/201612/580140.html 1)数据库设计方面: a. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 o ...

  3. python——re模块(正则表达式)

    re 模块的使用: 1.使用compile()函数编译一个parttern对象, 例如:parttern=re.compile(r'\d+') 2.通过pattern对象提供的一系列属相和方法,对文本 ...

  4. 【Tomcat】Tomcat替换猫的图片

    参考:网页title上添加图片 直接替换Tomcat安装目录下ROOT下面的favicon.ico图标(名字与前面一样favicon.ico)

  5. Raphael.js image 在ie8以下的兼容性问题

    Raphael.js 在ie7,ie8浏览器内绘制图形採用的vml,在绘制image的时候会解析成 <?xml:namespace prefix = "rvml" ns = ...

  6. LeetCode 83. Remove Duplicates from Sorted List (从有序链表中去除重复项)

    Given a sorted linked list, delete all duplicates such that each element appear only once. For examp ...

  7. TTS-零基础入门-10分钟教你做一个语音功能

    在本片博客正式開始之前,大家先跟我做一个简单的好玩的 小语音. 新建一个文本文档,然后再文档里输入这样 一句话  CreateObject("SAPI.SpVoice").Spea ...

  8. opencv中RGB转HSV

    cvCvtColor(src,dst,CV_BGR2HSV); 当中,src为三通道的,dst也为三通道的. OPENCV 中 H.S.V.顺序分别为3*x+0  3*x+1   3*x+2 open ...

  9. 为PhoneGap写一个android插件

    为PhoneGap写一个android插件,要怎么做? 其实这句话应该反过来说,为android写一个PhoneGap插件,要怎么做? 这里以最简单的Hello World!为例,做个说明: 1.第一 ...

  10. Linux ALSA声卡驱动之六:ASoC架构中的Machine

    前面一节的内容我们提到,ASoC被分为Machine.Platform和Codec三大部分,其中的Machine驱动负责Platform和Codec之间的耦合以及部分和设备或板子特定的代码,再次引用上 ...