「BZOJ 4318」OSU!

题目链接

戳我

(Solution)

我们考虑每增加一个(1)会对答案有什么影响:

[E((x+1)^3)-E(x^3)=E(3x^2+3x+1)=3E(x^2)+3E(x)+1 ]

所以我们只需要维护(E(x^2))(E(x))

令:
(x1[i]=E(x))
(x2[i]=E(x^2))
(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])

然后写的时候可以把数组省掉

(Code)

#include<cstdio>
double p,x1,x2,ans;
int main(){
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%lf",&p),ans+=(x2*3+x1*3+1)*p,x2=p*(x2+2*x1+1),x1=(x1+1)*p;
	printf("%0.1lf",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/hbxblog/p/10784773.html