【浙江集训】wander
来源:互联网 发布:群排名优化技术 编辑:程序博客网 时间:2024/04/27 20:04
题目描述
给出一棵包含
行走的伪代码如下:
count = 0bool 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 -1DFS( u, -1 )
要求实现
- 在
x 与y 之间修建一条道路,若此前x 与y 之间有路径相连则无视此次操作 - 若
x 与y 之间存在一条直接相连的道路,则去掉之 - 询问从
u 走到v 的期望步数
分析
首先分析一下要求的期望步数是个什么东西。
读懂伪代码后发现它实际上是一个按照随机顺序遍历这棵树,直到遇到终点。
假如我们某一步走了岔路,那么显然要遍历完这条岔路对应的整一棵子树。那么在每一个点上我们只关注终点所在子树,以及它之前遍历的有哪一些子树。
不妨记
从总体来看,
注意这一项
由于这里取遍所有的满足
- 当
k=0 时,分子为0 - 当
k=1 时,分子为2sizex¯¯¯¯¯¯¯¯ - 当
k=2 时,分子为4sizex¯¯¯¯¯¯¯¯ ⋯ - 当
k=m 时,分子为2msizex¯¯¯¯¯¯¯¯
于是这一项实际上是
总的那一项,实际上就是以
所以我们需要维护的东西就很明确了
- 子树大小
- 连通性
- 支持动态加或删边
用LCT可以轻松解决后两个问题。
但是LCT怎么维护子树大小呢?
不妨记
- 在
access 时,有可能将一个虚儿子变成重儿子,此时需要对extra 和link 做出一些调整 - 在
splay 时需要对extra 做出一些调整 - 加边时需要对
extra 做出一些调整 - 删边时需要对
link 做出一些调整
剩下任意的操作都不会对
于是子树大小求出来了,剩下的就是LCT的常规维护了。
时间复杂度
空间复杂度
- 【浙江集训】wander
- Wander
- Re: wander.cpp position update
- 集训
- 浙江公共频道
- 浙江下雪
- 浙江一行
- 浙江奉化
- 浙江大华的研发
- 浙江商人的军规
- 10-02-09 浙江
- 浙江网新恒天面试
- 浙江永强
- 浙江的生活
- 浙江理工3881
- 浙江理工3882
- 浙江大华笔试题
- 浙江头痛医院
- Hibernate批量处理海量
- 如何用eclipse打jar包
- jquery 省市二级联动
- php + mysql 调用数据库内容 =》 简介
- Debian8下安装搜狗输入法(fcitx安装)
- 【浙江集训】wander
- Unity3d获取在Asset中选中的目录、资源 的路径
- 在WPS中粘帖代码保持代码高亮
- PCI总线和设备
- Protobuf extensions的理解
- protoc-gen-lua extensions正确的使用方式
- 磁盘(卷)过滤总结
- Protobuf-Lua 中使用 Enum
- Android学习笔记(16):绝对布局AbsoluteLayout、常用距离单位