设 (f_{i,j}) 表示节点 (i) 的子树深度为 (le j) 的概率,(ch_i) 表示 (i) 的儿子节点集合。
(2^{-50}) 以下的值由于精度忽视。
[f_{i,j}=
egin{cases}
frac{1}{2^{|ch_i|}}&(j=0)\
prod_{sin ch_i}frac{f_{s,j-1}+1}{2}&(j>0)\
end{cases}
]
//Data
const int N=5e5,D=50;
int n,fa[N+7]; db f[N+7][D+7];
void wen(int u){for(int i=0;i<=D;i++) f[u][i]=1;}
//Main
int main(){
int q=ri; wen(n=1);
for(int ti=1;ti<=q;ti++){
int o=ri,r=ri;
if(o==1){
int u=++n; wen(u),fa[u]=r;
vector<int> ve;
for(int v=u,d=0;v&&d<=D;v=fa[v],d++) ve.pb(v);
for(int v=sz(ve)-1;v>=1;v--)
for(int i=1;i<=D;i++) f[ve[v]][i]/=(f[ve[v-1]][i-1]+1)/2;
f[r][0]/=2;
for(int v=1;v<=sz(ve)-1;v++)
for(int i=1;i<=D;i++) f[ve[v]][i]*=(f[ve[v-1]][i-1]+1)/2;
} else {
db res=0;
for(int i=1;i<=D;i++) res+=(f[r][i]-f[r][i-1])*i;
printf("%.10lf
",res);
}
}
return 0;
}
祝大家学习愉快!