bzoj 4318 || 洛谷P1654 OSU!
https://www.lydsy.com/JudgeOnline/problem.php?id=4318
https://www.luogu.org/problemnew/show/P1654
看来自己还是naive...
注意:和的期望=期望的和;平方的期望!=期望的平方,立方的期望!=期望的立方
那么怎么算一组变量的和的立方的期望呢?当然是不能用和的期望的立方的
a,b互相独立时,
$E((a+b)^3)=E(a^3+3*a^2*b+3*a*b^2+b^3)=E(a^3)+3*E(a^2)*E(b)+3*E(a)*E(b^2)+E(b^3)$
$E((a+b)^2)=E(a^2)+2*E(a)*E(b)+E(b^2)$
$E(k*a)=k*E(a)$(k为常数)
于是,如果要算变量的和的立方的期望,就维护一下变量的立方,平方,本身的期望,按以上规则合并
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #include<vector> 5 using namespace std; 6 #define fi first 7 #define se second 8 #define mp make_pair 9 #define pb push_back 10 typedef long long ll; 11 typedef unsigned long long ull; 12 typedef pair<int,int> pii; 13 double a11,a12,a13; 14 //a11表示当前全1段长度期望,a12表示当前段长度平方期望,a13表示当前段长度立方期望 15 double a2;//a2表示之前段答案期望 16 int n; 17 int main() 18 { 19 double t,t11,t12,t13,t2; 20 scanf("%d",&n); 21 while(n--) 22 { 23 scanf("%lf",&t); 24 t11=t*(a11+1); 25 t12=t*(a12+1+2*a11); 26 t13=t*(a13+3*a12+3*a11+1); 27 t2=a2+(1-t)*a13; 28 a11=t11; 29 a12=t12; 30 a13=t13; 31 a2=t2; 32 //printf("1t%f %f %f %f\n",a11,a12,a13,a2); 33 } 34 printf("%.1f",a13+a2); 35 return 0; 36 }