Codeforces.280C.Game on Tree(期望)

题目链接

参考:浅谈期望的线性性(可加性)
Codeforces 280C Game on Tree 概率dp 树上随机删子树 求删完次数的期望(这个的前半部分分析并没有看。。)

\(Description\)
给你一棵有\(n\)个白点的有根树,每次随机选择一个点,将它和它的子树中所有点染黑。
问期望操作多少次后所有点都被染黑?

\(Solution\)
期望好玄啊。。(好吧是我太弱)
因为概率具有可加性,一棵树可以分解为多棵子树,而子树分解的最终状态就是点,所以我们可以计算每个点的期望操作次数再求和,即\[E(总操作次数)=E(每个点被选中操作次数)\]
这个期望操作次数是指作为白点被选中染黑的期望次数。
因为一个点祖先节点被染黑后,这个节点操作次数就为0了,所以得出一个点x的期望E(x)=1/dep[x].
直接DFS。。

//62ms  9872KB
#include <cstdio>
#include <cctype>
#define gc() getchar()
const int N=1e5+5;

int n,Enum,H[N],nxt[N<<1],to[N<<1];
double Ans;

inline int read()
{
    int now=0;register char c=gc();
    for(;!isdigit(c);c=gc());
    for(;isdigit(c);now=now*10+c-'0',c=gc());
    return now;
}
inline void AddEdge(int u,int v)
{
    to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum;
    to[++Enum]=u, nxt[Enum]=H[v], H[v]=Enum;
}
void DFS(int x,int f,int d)
{
    Ans+=1.0/d;
    for(int i=H[x]; i; i=nxt[i])
        if(to[i]!=f) DFS(to[i],x,d+1);
}

int main()
{
    n=read();
    for(int u,v,i=1; i<n; ++i) u=read(),v=read(),AddEdge(u,v);
    DFS(1,1,1);
    printf("%.10lf",Ans);

    return 0;
}

原文地址:https://www.cnblogs.com/SovietPower/p/8674775.html

时间: 2024-10-10 21:57:05

Codeforces.280C.Game on Tree(期望)的相关文章

Codeforces 280C Game on Tree 概率dp 树上随机删子树 求删完次数的期望

题目链接:点击打开链接 题意:给定n个点的一棵树 每次操作随机选任意一个点,把这个点和这个点的子树删去. 当把所有点删去则停止. 问操作次数的期望. 题解引用自:点击打开链接 删除的规则拥有一个非常好的性质:对于任意(u,v),选择u会导致删除v,那么选择u会删除的点集合一定包含选择了v以后会删除的点集合. 我们考虑换一种方式来实现删除的过程: 产生一个随机的1-n的排列P,从前往后依次尝试删除这些点,如果当前点已经被删除,就什么都不干,否则把次数+1,删除这个点以及他的所有后代. 通过这种方式

Codeforces 280C. Game on Tree

题目描述 乍一看每一个点被选它自己而被染色到的概率都是1/n,但仔细想想就会发现,某一个点对答案的贡献只与这个点有多少个祖先有关. 因为如果这个点会被选到,当且仅当它的所有祖先都没有被选到(题目中说会将选到的点所在的整棵子树都染成黑色),所有每个点被选而被染色的概率为1/deep[i]. 又因为每次选的代价为一,所以每个点对答案的贡献就是1/deep[i]. #include<complex> #include<cstdio> using namespace std; const

Codeforces 461B Appleman and Tree(木dp)

题目链接:Codeforces 461B Appleman and Tree 题目大意:一棵树,以0节点为根节点,给定每一个节点的父亲节点,以及每一个点的颜色(0表示白色,1表示黑色),切断这棵树的k条边,使得树变成k+1个联通分量.保证每一个联通分量有且仅有1个黑色节点.问有多少种切割方法. 解题思路:树形dp,dp[i][0]和dp[i][1]分别表示子树一下的切割方法中,i节点所在联通块不存在黑节点和已经存在一个黑节点的方案数. #include <cstdio> #include &l

codeforces 161D - Distance in Tree(树形dp)

题目大意: 求出树上距离为k的点对有多少个. 思路分析: dp[i][j] 表示 i 的子树中和 i 的距离为 j 的点数有多少个.注意dp[i] [0] 永远是1的. 然后在处理完一颗子树后,就把自身的dp 更新. 更新之前更新答案. 如果这颗子树到 i 有 x 个距离为j的.那么答案就要加上 dp[i] [ k-j-1] * x; #include <iostream> #include <cstdio> #include <cstring> #include &l

Codeforces 461B Appleman and Tree(树形dp)

题目链接:Codeforces 461B Appleman and Tree 题目大意:一棵树,以0节点为根节点,给定每个节点的父亲节点,以及每个点的颜色(0表示白色,1表示黑色),切断这棵树的k条边,使得树变成k+1个联通分量,保证每个联通分量有且仅有1个黑色节点.问有多少种分割方法. 解题思路:树形dp,dp[i][0]和dp[i][1]分别表示子树一下的分割方法中,i节点所在联通块不存在黑节点和已经存在一个黑节点的方案数. #include <cstdio> #include <c

Educational Codeforces Round 25 G. Tree Queries

题目链接:Educational Codeforces Round 25 G. Tree Queries 题意: 给你一棵树,一开始所有的点全是黑色,有两种操作. 1 x 将x这个点变为黑色,保证第一个操作是这个. 2 x 询问x到任意黑色的点的简单路径上的最小节点编号. 题解: 首先将一个变为黑色的点当成树根,然后dfs一下,预处理出所有点的答案. 然后开一个变量记录一下当前变黑的点的答案cur=min(cur,dp[x]). 每次询问的时候答案就是min(cur,dp[x]). 如果觉得很神

CF280C Game on Tree (期望)

CF280C Game on Tree 期望的确是个玄学(原因可能是我太弱了) 还是不太会呢. 题意:期望多少次操作可以将树全部染黑 话说这个题求概率呢. 因为期望的线性性质,一棵树可以分解为多棵子树,而子树分解的最终状态就是点,所以我们可以计算每个点的期望操作次数再求和,这里的每个点的操作次数是指在这个点上操作. 因为在操作之前不能被染黑,并且必须要染黑. 所以期望次数为\(\sum_{i=1}^n1/dep[i]\) #include <iostream> #include <cst

[Codeforces 464D]World of Darkraft(期望DP)

[Codeforces 464D]World of Darkraft(期望DP) 题面 游戏中有k种装备,每种装备初始时都是等级1.zyd每打一只怪,就会随机爆出一件装备.掉落和更新装备方式如下: 假设这种装备当前等级为t,那么系统会在[1,t+1]中等概率随机出该装备的等级.爆出装备后,会装备上身上的和爆出的装备之间等级更高的那件,并卖掉等级更低的装备.其中等级为i的装备价格为i金币. 求打了n只怪后获得金币的期望值,精确到\(10^{-9}\). \(n,k\leq 10^5\) 分析 首先

CF 500D New Year Santa Network tree 期望 好题

New Year is coming in Tree World! In this world, as the name implies, there are n cities connected by n - 1 roads, and for any two distinct cities there always exists a path between them. The cities are numbered by integers from 1 to n, and the roads