zoukankan      html  css  js  c++  java
  • 转一篇CF题目的博客

    题意:

    给你一颗n(n<=10^5)个节点树根为1的树,然后进行dfs,求每个点,在dfs中被访问时间的期望。

    let starting_time be an array of length n
    current_time = 0
    dfs(v):
    	current_time = current_time + 1
    	starting_time[v] = current_time
    	shuffle children[v] randomly (each permutation with equal possibility)
    	// children[v] is vector of children cities of city v
    	for u in children[v]:
    		dfs(u)

    我们求的就是starting_time[v]的期望pv。

    题解:

    我们来求一下节点2的期望。

    1、我们知道我们要先通过2节点的父亲1才能到2。但2节点什么时候访问是不固定的。

    我们假设ri代表i为根的子树,我们能得到下列六种访问次序:

    r2 r4 r5

    r2 r5 r4

    r4 r2 r5

    r5 r2 r4

    r4 r5 r2

    r5 r4 r2

    对应的2节点的starting_time[v]分别为2,2,5,3,6,6.我们能得到2节点的期望为p[2]=(2+2+5+3+6+6)/6=4.0

    2、但是我们不能这样算,其实我们可以来算r4和r5给2节点的贡献:p[2]=p[1]+1+(3*size(r4)+3*size(r5))/6。

    我们发现r4和r5各有一半的情况是出现在2节点的前面的。我们就得出了递推公式:

    p[i]=p[fa[i]]+1+(size(fa[i])-size(i)-1)/2  从根节点dfs下来就可以了。

  • 相关阅读:
    202104-2 邻域均值
    202104-1 灰度直方图
    1384. 饲料调配
    1381. 阶乘
    264. 丑数 II
    1380. 邮票
    42 新安装的idea必备设置
    41 cmd中解除被占用的端口
    40 文件在线预览
    39 进度条使用
  • 原文地址:https://www.cnblogs.com/Commence/p/5677580.html
Copyright © 2011-2022 走看看