笔记-CF643E Bear and Destroying Subtrees

CF643E Bear and Destroying Subtrees


(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;
} 


祝大家学习愉快!

原文地址:https://www.cnblogs.com/Wendigo/p/13031831.html