Description:
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 pi probability 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.9Output
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
题意:
给n个位置,给出1-n上每个位置出现O的概率pi,记分规则如下,连续的x个O记为x^2分,求和,如 XXOOOXOXOOXX得分为
求得分的期望
思考一下,我们能比较容易地得出O(n^2)的方法
令dp[i]为前i的得分期望
那么
显然这题
考虑一下变换记分的方式
我们有
那么记分方式就变为
一段连续的O,有多少对O×2+O的个数
一对O可以贡献2分
现在得分来源变为两个地方
一对O(2分),和单个O(1分)
我们知道
期望=概率×收益
我们找到每个对O的概率×2
再找到单个O×出现概率
求和即是期望得分
对于某一个点i
有(1,i) (2,i) (3,i) (4,i)...(i-1,i)这些对O,每个概率即是从左到右连乘,比如
令这些概率和为dp[i],即
这样我们有递推关系
对i+1点来说,
dp求和即是所有对O出现的概率之和×2+单个O出现的概率×1
求得的即是期望分数
AC代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<stdlib.h>
#include<queue>
#include<map>
#include<vector>
#include<math.h>
const int INF = 0x3f3f3f3f;
using namespace std;
typedef long long ll;
typedef double ld;
int i,j,k,l;
const int NN=111111;
double f[NN];
double dp[NN];
int main()
{
int n;scanf("%d",&n);
double sum=0;
for(int i=1;i<=n;i++)
{
scanf("%lf",&f[i]);
sum+=f[i];
}
double ans=0;
for(int i=2;i<=n;i++)
{
dp[i]=(dp[i-1]+f[i-1])*f[i];
ans+=dp[i];
}
printf("%.12f\n",ans*2.0+sum);
return 0;
}