【浙江集训】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)
相关文章推荐
- lesson3 Qt Signal and slots (QSlider and QProgressBar)
- Json转换
- Json转换
- oracle 11g 手动建库
- Debian8下安装搜狗输入法(fcitx安装)
- php + mysql 调用数据库内容 =》 简介
- 如何用eclipse打jar包
- jquery 省市二级联动
- jQuery省市区三级联动
- 解题报告(LeetCode):Max Points on a Line
- Hibernate批量处理海量
- A girl’s love from cc98侵删
- 程序员标准
- [技术学习]正则表达式分析
- 夏虫不可语于冰
- 枚举实现的责任链_demo_me
- 幸福感
- poj 3517 And Then There Was One 约瑟夫问题
- 岭深常得蛟龙在 梧高自有凤凰栖
- 在带有cache和MMU的处理器内核上的指令执行过程