给定n个数,求i的位置的期望
那么反向考虑,j!=i排在i前面的概率是0.5,那么对i的位置的期望贡献就是1*0.5
这题就是拓展应用一下
#include<bits/stdc++.h> using namespace std; const int maxn = 200005; const double esp = 1e-7; vector<int>G[maxn]; int n,size[maxn]; double E[maxn]; void dfs1(int u,int pre){ size[u]=1; for(int i=0;i<G[u].size();i++){ int v=G[u][i]; if(v==pre)continue; dfs1(v,u); size[u]+=size[v]; } } void dfs2(int u,int pre){ if(u==1)E[u]=1.0; for(int i=0;i<G[u].size();i++){ int v=G[u][i]; if(v==pre)continue; E[v]=1.0*(size[u]-size[v]-1)/2+E[u]+1; dfs2(v,u); } } int main(){ cin>>n; for(int i=2;i<=n;i++){ int fa; cin>>fa; G[fa].push_back(i); G[i].push_back(fa); } dfs1(1,1); dfs2(1,1); for(int i=1;i<=n;i++) cout<<E[i]<<" "; }