link-cut tree

动态树(准确说是维护森林)之一,支持连边,断边,求链上权值和等操作。

splay基础:会rotate和splay就行。还要会一点区间反转操作打标记。很基♂础的东西。

有重链,每条重链用splay来维护,splay中排名为这条重链中深度值,顺便把链的要维护信息(譬如链上点权和)统计了。

边分实边和虚边,实边有ch数组记录,虚边则没有。都有fa数组记录。
虚边链接两条重链。父子关系即原树的父子关系。

连到父亲的边为虚边的点就是这条重链的splay的根。

splay

splay(x)。先从上往下下放一遍,再执行splay。
注意rotate中如果y-z的边是虚边不用往回连。

access

access(x)。最主要操作&&最耗时间的操作,没有之一。

拉一条从x所在树的根节点到x的链。

从x开始往上拉,y初始化为0,每次先splay(x),x左子树为连上去的重链,右子树为连下去的重链。
断掉右子树的边,连成y。(断边指实变虚

makeroot

makeroot(x)。将x变成x所在树的根。
先access(x),这时有一条从root到x的重链。
然后splay(x),再在x上打一个反转标记(这条重链上的深度要反转)

split

split(x,y)。搞出一条重链,两端点为x和y。
makeroot(x),access(y),splay(y)。
不多解释了?
(我习惯把这个直接写进代码,so看不到split函数)

link

link(x,y)。连一条x-y的边。
makeroot(x),然后将FA♂x置为y。
这里连轻边没事的。

cut

cut(x,y)。割♂掉x-y的边。
split(x,y),然后x在y左儿子处不解释。
FA♂x=ch[y][0]=0。

find

找到x所在树的根。主要用于判断连通性???
先access(x),splay(x),再一直往左边走就找到根了。不解释了。。。

写到这里吧。

已经做了的板子题:
洞穴勘测
弹飞绵羊

最新文章

  1. smarty下如何将一个数保存为两位小数
  2. java实现a+b的多重输入
  3. dtw算法
  4. LInux 安全测试 2
  5. 宽字节SQL注入
  6. hdu 5422 Rikka with Graph(简单题)
  7. Jquery实现图片切换效果(IE,FF,Goole)都可以正常运行
  8. redis 梳理笔记(二)
  9. pycharm中连接数据库常见问题
  10. SpringBoot 部署到linux环境
  11. HashMap是如何工作的
  12. Visual Studio 各版本下载
  13. 如何用Win7远程链接ubuntu14.04桌面
  14. vue中监听window.resize的变化
  15. vulcanjs 简单package 编写
  16. bootstrap表单按回车会自动刷新页面的问题
  17. 转:http协议学习
  18. 简单线性dp
  19. python复习目录
  20. VS2013 自动添加头部注释 -C#开发

热门文章

  1. EXC_BAD_ACCESS错误
  2. Linux tree命令详解
  3. 铁乐学python_day10_作业
  4. 铁乐学python_day02-作业
  5. grafana的安装与设置(一)
  6. QT里使用Gsoap调用WebService
  7. U-Mail邮件群发触发器功能助力营销自动化
  8. chrome开发者工具那点事
  9. mysql中FIND_IN_SET函数的使用
  10. JavaScript-2.内置对象---简单脚本之弹出对话框显示当前时间 ---ShinePans