天天看点

CodeForces 280C Game on Tree 概率

题目链接:http://codeforces.com/problemset/problem/280/C

推荐阅读博客:http://blog.csdn.net/qq574857122/article/details/41688045

题意:给定一个有根树,然后对这个树进行操作,删除某个节点i及其所有的后代节点,已经删除了的节点不能再次删除,然后不断这样操作,直到把所有的节点全部删除了位置,

然后题目要求一个数学期望,考虑把所有的节点全部都删除掉需要多少步,每次选择删除的节点是随机的(当然不能选择已经删除掉了的节点),删除操作步数的数学期望,

思路:直接考虑感觉比较麻烦,如果直接考虑所有的情况,肯定是不行的,会超时,那么是不是可以换个思路想,统计每个节点对答案的贡献

直接求是设随机变量x为步数,即xi代表的是节点i出现的步数那么E(X)=sum(Pi*xi)

 也可以设随机变量y为每个节点出现在所有操作序列中次数的数学期望,E(Y)=sum(yi)

好吧前面我自己也不知道写的是什么,记住这个就好了,统计每个节点对答案的贡献

首先需要把操作序列泛化,而不是直接考虑按题目意思来构造操作序列

记一个1,2...,n  的n元排列,那么按照序列的次序来进行删除操作,那么如果这个节点以及在前面的操作过程中删除了,就不算它对答案的贡献吧,因为它不是一个有效步吧

那么要怎么算他对答案的贡献了,首先要知道一个节点的祖先节点的数目,也就是节点的深度d,假设根的深度为1

在所有的n元排列中(一空有n!)种,在考虑第i个节点的时候,如果他对答案有贡献,那么他就要是在删除他前面的操作之前没有被删除,也就是说前面没有他的祖先,

等价于他的祖先全部都在删除他的操作的后面,那么怎么计算这个数目呢,

可以这样考虑所有的n!的排列中,一共有d个节点是需要特别考虑的(包括节点i自己),先给出公式( n!*(d-1)!)/d!

解释:所有的排列中如果那d个节点是固定的,那么就有n!/d!种其他节点的不同排列,由于只需要节点i在他的祖先的前面,那么祖先的d-1个节点有(d-1)!中

所有总共有( n!*(d-1)!)/d!种情况下节点i是会对答案有贡献的,他们每个节点只会有一步的贡献,也就是n!/d

那么他都数学期望的贡献就是(n!/d)/n!  ,(因为有n!中情况呀)

也就是1/d  ,好吧真是太简洁了,

那么计算题目的答案就只需要算所有节点的深度的倒数的和就可以了,只需要dfs(因为是树,可以直接找到深度)或者bfs一遍就好了