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下来就可以了。

  • 相关阅读:
    Ubuntu Server下docker实战 02: docker进阶配置
    Ubuntu Server下docker实战 01: 安装docker
    简单一个方法实现商品组合管理--递归笛卡尔
    Little-Endian小字节序
    BinaryWriter和BinaryReader用法
    C#位运算
    TCP协议三次握手过程分析
    简述HTTP过程
    c# 版贪食蛇
    今日头条列表json
  • 原文地址:https://www.cnblogs.com/Commence/p/5677580.html
Copyright © 2011-2022 走看看