4318: OSU!
Time Limit: 2 Sec Memory Limit: 128 MBSubmit: 388 Solved: 306
[ Submit][ Status][ Discuss]
Description
Input
Output
Sample Input
0.5
0.5
0.5
Sample Output
HINT
N<=100000
解题思路:期望与概率,终于手推出来了。首先明确每个点
的贡献如何计算,每个点的价值是:假设当前点前面有L个一
再前面一个0,那么它的价值就是3*L²+3*L+1,那么我们就得出了
ans的计算公式为对于每个点x累加(3*L²+3*L+1)*sug(x)/sug(x-L+1)*(1-p[x-L+1])
这个式子可以进行转化,发现答案就为1*sug(x)/sug(x-1)+6*sug(x)/sug(x-2)······
那就可以O(n)求了。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n;
long double a[100100];
int main()
{
scanf("%d",&n);
long double a1=0,a2=0;
long double sug=0; a[0]=1;
double x;
scanf("%lf",&x);
a[1]=x; a2=a[1]; sug=a[1]; a1=a[1];
for(int i=2;i<=n;++i)
{
double x;
scanf("%lf",&x); a[i]=x;
sug=sug*a[i];
a1=a1*a[i]+6*sug-a[i-1]*a[i]+a[i];
sug+=a[i];
a2+=a1;
}
printf("%.1lf",(double)a2);
}