[ BZOJ 4318 & 3450 / CodeForces 235 B ] OSU!
\(\\\)
\(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!的更多相关文章
- [codeforces 235]A. LCM Challenge
[codeforces 235]A. LCM Challenge 试题描述 Some days ago, I learned the concept of LCM (least common mult ...
- BZOJ 4318: OSU! 期望DP
4318: OSU! 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4318 Description osu 是一款群众喜闻乐见的休闲软件 ...
- 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 ...
- ●BZOJ 4318 OSU!
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4318题解: 期望dp 如果我们能够得到以每个位置结尾形成的连续1的长度的相关期望,那么问题就 ...
- BZOJ 4318 OSU!(概率DP)
题意 osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: 一共有n次操作,每次操作只有成功与失败之分,成功对应1,失败对应0,n次操作对应为1个长度为n的01串.在 ...
- bzoj 4318 OSU! - 动态规划 - 概率与期望
Description osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: 一共有n次操作,每次操作只有成功与失败之分,成功对应1,失败对应0,n次操作对应为1 ...
- BZOJ - 4318: OSU! (期望DP&Attention)
Description osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: 一共有n次操作,每次操作只有成功与失败之分,成功对应1,失败对应0,n次操作对应为1 ...
- 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 ...
- OSU!(bzoj 4318)
Description osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: 一共有n次操作,每次操作只有成功与失败之分,成功对应1,失败对应0,n次操作对应为1 ...
随机推荐
- 泛型转换https://www.cnblogs.com/eason-chan/p/3633210.html
import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;//总结1.st.getClass==Student. ...
- Codeforces Round #228 (Div. 2)
做codeforces以来题目最水的一次 A题: Fox and Number Game 题意:就是用一堆数字来回减,直到减到最小值为止,再把所有最小值加,求这个值 sol: 简单数论题目,直接求所有 ...
- 总结懒加载的解决方法(全)org.hibernate.LazyInitializationException: could not initialize proxy - no Session
如下错误:org.hibernate.LazyInitializationException: could not initialize proxy - no Session 原因是懒加载的问题,因为 ...
- 又见GCD
Problem Description 有三个正整数a,b,c(0<a,b,c<10^6),其中c不等于b.若a和c的最大公约数为b,现已知a和b,求满足条件的最小的c. Input ...
- QT .pro文件的学习收获
1. 载pro文件预定义宏: CONFIG(debug,debug|release){ DEFINES+=__DEBUG__ }else{ DEFINES+=__RELEASE__ macx:DEST ...
- $scope的生命周期
model mutation 模型改变 model observation 模型观察 scope destruction scope结束 神奇的scope,一个angular应用只有一个scope,一 ...
- poj——2084 Game of Connections
Game of Connections Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 8664 Accepted: 42 ...
- 局域网部署docker--从无到有创建自己的docker私有仓库
因为GFW的关系.国内用户在使用docker的时候,pull一个主要的镜像都拉下来.更不用说使用官方的index镜像了.差点放弃使用docker了,google了一圈.总算找到办法. 第一步:安装do ...
- PHP第五课 自己主动类型转换与流程控制
学习概要: 1.了解自己主动类型转换的有哪些 2.了解主要的流程控制语句 3.实例:实现日历表格的写法 自己主动类型转换 1)整型转字符串 echo $num."abc"; 2)字 ...
- (寻找第K小的数&&寻找第K小的数的和)
这一篇博客以一些OJ上的题目为载体,讲一下寻找第K小的数的方法 方法一: 先将数据排列好,然后,然后return a[k]或者将前K个数加起来 方法二: 基于高速排序.如,一次高速排序将某一个数放到了 ...