Loading

笔记-CF643E Bear and Destroying Subtrees

CF643E Bear and Destroying Subtrees


\(f_{i,j}\) 表示节点 \(i\) 的子树深度为 \(\le j\) 的概率,\(ch_i\) 表示 \(i\) 的儿子节点集合。

\(2^{-50}\) 以下的值由于精度忽视。

\[f_{i,j}= \begin{cases} \frac{1}{2^{|ch_i|}}&(j=0)\\ \prod_{s\in 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\n",res);
		}
	}
	return 0;
} 


祝大家学习愉快!

posted @ 2020-06-02 16:02  George1123  阅读(126)  评论(0编辑  收藏  举报