您的位置:首页 > 其它

【浙江集训】wander

2015-12-12 02:04 162 查看

题目描述

给出一棵包含nn个点的森林。问按照以下规则行走,从uu走到vv的期望步数是多少。

行走的伪代码如下:

count = 0

bool DFS( x, fa )
if ( x==v ) return 1
random_shuffle(e[x])
for each y in e[x]   // which means that all the order of has the same possibility to be chosen
++count
if ( DFS( y, x ) ) return 1
++count
return -1

DFS( u, -1 )


要求实现QQ个操作,包括以下三种

在xx与yy之间修建一条道路,若此前xx与yy之间有路径相连则无视此次操作

若xx与yy之间存在一条直接相连的道路,则去掉之

询问从uu走到vv的期望步数

n≤105,Q≤2×105n\leq 10^5, Q\leq 2\times 10^5

分析

首先分析一下要求的期望步数是个什么东西。

读懂伪代码后发现它实际上是一个按照随机顺序遍历这棵树,直到遇到终点。

假如我们某一步走了岔路,那么显然要遍历完这条岔路对应的整一棵子树。那么在每一个点上我们只关注终点所在子树,以及它之前遍历的有哪一些子树。

不妨记E(x)E(x)表示从xx走到vv的期望,当前所在的点为xx,遍历的顺序为p0,p2,⋯,pmp_0, p_2, \cdots, p_m,终点所在子树的根是yy,排在第kk位,sizex¯¯¯¯¯¯¯¯\overline {size_x}表示除通往yy的那棵子树,其它子树大小的平均数,于是

E(x)=∑mk=0(∑P,pk=y∑k−1i=0sizepi+E(pk)+1)(m+1)!=∑mk=0∑P,pk=y∑k−1i=02sizepi(m+1)!+E(y)+1E(x)=\frac{\sum_{k=0}^m(\sum_{P, p_k=y}\sum_{i=0}^{k-1}size_{p_i}+E(p_k)+1)}{(m+1)!}=\frac{\sum_{k=0}^m\sum_{P, p_k=y}\sum_{i=0}^{k-1}2size_{p_i}}{(m+1)!}+E(y)+1

E(v)=0E(v)=0

从总体来看,E(y)+1E(y)+1这一项在E(u)E(u)中总共就恰好是uu到vv的路径长度。

注意这一项

∑mk=0∑P,pk=y∑k−1i=02sizepi(m+1)!=∑mk=0∑P,pk=y∑k−1i=02sizepim!m+1=∑mk=0∑k−1i=02sizepik!∑pk+1⋯pm1(m−k)!m+1=∑mk=0∑k−1i=02sizepik!m+1\frac{\sum_{k=0}^m\sum_{P, p_k=y}\sum_{i=0}^{k-1}2size_{p_i}}{(m+1)!}=\frac{\sum_{k=0}^m\frac{\sum_{P, p_k=y}\sum_{i=0}^{k-1}2size_{p_i}}{m!}}{m+1}=\frac{\sum_{k=0}^m\frac{\sum_{i=0}^{k-1}2size_{p_i}}{k!}\frac{\sum_{p_{k+1}\cdots p_m}1}{(m-k)!}}{m+1}=\frac{\sum_{k=0}^m\frac{\sum_{i=0}^{k-1}2size_{p_i}}{k!}}{m+1}

由于这里取遍所有的满足pkp_k为通往终点的点的可能的顺序,观察一下

当k=0k=0时,分子为00

当k=1k=1时,分子为2sizex¯¯¯¯¯¯¯¯2\overline {size_x}

当k=2k=2时,分子为4sizex¯¯¯¯¯¯¯¯4\overline {size_x}

⋯\cdots

当k=mk=m时,分子为2msizex¯¯¯¯¯¯¯¯2m\overline {size_x}

于是这一项实际上是

m(m+1)sizex¯¯¯¯¯¯m+1=∑z≠ysizez\frac{m(m+1)\overline{ size_x }}{m+1}=\sum_{z\neq y}size_z

总的那一项,实际上就是以uu为根的树,减去vv为根的子树大小。

所以我们需要维护的东西就很明确了

子树大小

连通性

支持动态加或删边

用LCT可以轻松解决后两个问题。

但是LCT怎么维护子树大小呢?

不妨记linkxlink_x表示当前形态的这棵树xx代表的重链,最高的一个点的子树大小(注意这里要是指包括它本身和splay树的儿子所形成的一段重链)。extraxextra_x表示xx的所有虚边连出的点它们的子树大小和。那么

在accessaccess时,有可能将一个虚儿子变成重儿子,此时需要对extraextra和linklink做出一些调整

在splaysplay时需要对extraextra做出一些调整

加边时需要对extraextra做出一些调整

删边时需要对linklink做出一些调整

剩下任意的操作都不会对extraextra和linklink造成影响。

于是子树大小求出来了,剩下的就是LCT的常规维护了。

时间复杂度O(nlogn)O(nlogn)

空间复杂度O(n)O(n)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: