求一颗有根树,在任意一条边相互独立,并且有0.5的概率消失的情况下,
树的深度的期望
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int N=5e5+100;
int du[N];
double dp[N][110];
int T=60;
int pre[N];
int main(){
#ifdef DouBi
freopen("in.cpp","r",stdin);
#endif // gh546
int q,n;
while(scanf("%d",&q)!=EOF){
n=1;memset(du,0,sizeof(du));
for(int i=0;i<=T;i++)dp[1][i]=1;
while(q--){
int op,v;scanf("%d%d",&op,&v);
if(op==1){
n++;
for(int i=0;i<=T;i++)dp[n][i]=1;
pre[n]=v;
double tmp=dp[v][0];
du[v]++;
dp[v][0]=pow(0.5,du[v]);
int k=1;
while(k<=T&&pre[v]){
int u=pre[v];
double tmp1=dp[u][k];
dp[u][k]/=(0.5+0.5*tmp);
dp[u][k]*=(0.5+0.5*dp[v][k-1]);
k++;
v=u;
tmp=tmp1;
}
}
else {
double ans=0;
// for(int i=0;i<=n;i++){
// printf("%lf ",dp[v][i]);
// }printf("\n");
for(int i=1;i<=T;i++){
ans+=(dp[v][i]-dp[v][i-1])*i;
}
printf("%lf\n",ans);
}
}
}
return 0;
}