D. 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. For each click there are two outcomes: correct or bad. Let us denote correct as "O",
bad as "X", then the whole play can be encoded as a sequence of n characters "O" and "X".
Using the play sequence you can calculate the score for the play as follows: for every maximal
consecutive "O"s block, add the square of its length (the number of characters "O") to the score.
For example, if your play can be encoded as "OOXOOOXXOO", then there's three maximal
consecutive "O"s block "OO", "OOO", "OO",
so your score will be 22 + 32 + 22 = 17. If there are no correct clicks in a play then the score
for the play equals to 0.
You know that the probability to click the i-th (1 ≤ i ≤ n) click correctly is pi. In other words, the i-th
character in the play sequence has piprobability to be "O", 1 - pi to be "X". You task is to calculate
the expected score for your play.
Input
The first line contains an integer n (1 ≤ n ≤ 105) — the number of clicks. The second line contains
n space-separated real numbers p1, p2, ..., pn (0 ≤ pi ≤ 1).
There will be at most six digits after the decimal point in the given pi.
Output
Print a single real number — the expected score for your play. Your answer will be considered
correct if its absolute or relative error does not exceed 10 - 6.
Examples
input
3 0.5 0.5 0.5output
2.750000000000000input
4 0.7 0.2 0.1 0.9Copy
2.489200000000000input
5 1 1 1 1 1output
25.000000000000000Note
For the first example. There are 8 possible outcomes. Each has a probability of 0.125.
- "OOO" → 32 = 9;
- "OOX" → 22 = 4;
- "OXO" → 12 + 12 = 2;
- "OXX" → 12 = 1;
- "XOO" → 22 = 4;
- "XOX" → 12 = 1;
- "XXO" → 12 = 1;
- "XXX" → 0.
So the expected score is
思路:
没啥思路,先当经典题记住吧。记录两个量,一个是到当前位置为止的后缀的长度期望,
一个是后缀的得分期望。
详细思路见BZOJ 3450:(https://blog.csdn.net/qq_41661919/article/details/98585646),
本题只考虑第三种情况即可。
本题代码实现:
#include<iostream>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<cstdio>
#include<algorithm>
#define LL long long
#define INF 0x3f3f3f3f
using namespace std;
const int N=2e5+100;
const int M=6e3+100;
const int mod=1e9+9;
double p[N],dp1[N],dp2[N];
int main() {
#ifdef MYHOME
freopen("input.txt","r",stdin);
#endif
int n;
while(cin>>n){
memset(dp1,0,sizeof(dp1));
memset(dp2,0,sizeof(dp2));
for(int i=1;i<=n;i++){
cin>>p[i];
}
for(int i=1;i<=n;i++){
dp1[i]=(dp1[i-1]+1)*p[i];
dp2[i]=dp2[i-1]+(2*dp1[i-1]+1)*p[i];
}
printf("%.15lf\n",dp2[n]);
}
return 0;
}
THE END;