Splay&LCT
Splay && LCT
\(\text{Splay}\)
基本操作
1.\(Zig \& Zag\)

其思想是维护中序遍历不变
实现中我们不真的用\(Zig\)或\(Zag\)
而是注意到他们调用的左右永远是反的
一个函数就可以实现,一定每次看图
inline void rotate(re int x){
re int y=fa[x],z=fa[y],l=*son[x]^x,r=l^1;
if(fa[y])*son[z]==y?*son[z]=x:son[z][1]=x;fa[x]=z;
son[y][l]=son[x][r];fa[son[y][l]]=y;
son[x][r]=y;fa[y]=x;
pushup(x);pushup(y);
}
\(2.Splay\)
有三种情况\(Zig/Zag\)和\(Zig+Zig/Zag+Zag\)和\(Zig+Zag/Zag+Zig\)(永远从下往上)
记住一句话:
后面两个操作只有\(x\)与它父亲不共线就转它两次,否则转它一次
inline void Splay(re int x){
pushdown(x);
while(fa[x]){
if(fa[fa[x]])pushdown(fa[fa[x]]);pushdown(fa[x]);pushdown(x);
if(fa[fa[x]])((*son[fa[fa[x]]]==fa[x])^(*son[fa[x]]==x))?rotate(x):rotate(fa[x]);
rotate(x);
}
\(\text{LCT}\)
定义:
一种用来解决动态树上问题的数据结构
\(1.\)虚实链
每一个\(Splay\)维护的是一条从上到下按在原树中深度严格递增的路径,且中序遍历Splay得到的每个点的深度序列严格递增。
在辅助树上,每个点与自己儿子的链为实链
辅助树的根与其\(LCT\)的父亲的链为虚链
基本操作
\(0.isroot\)查询一个点是否为\(Splay\)的根
inline char isroot(re int x){return *son[fa[x]]^x&&son[fa[x]][1]^x;}
\(1.Access\)
表示把\(x\)与其实儿子边变虚,把到辅助树根链上边变实
inline void Access(re int x){re int y=0;while(x){Splay(x);son[x][1]=y;pushup(x);y=x;x=fa[x];}}
\(2.Evert\)
表示把\(x\)变为原树的根
注意光是变为辅助树的根是不够的还要把深度互换
inline void Reverse(re int x){rev[x]^=1;swap(*son[x],son[x][1]);}
inline void Evert(re int x){Access(x);Splay(x);Reverse(x);}
\(3.Link\)
inline void Link(re int x,re int y){Evert(x);fa[x]=y;}
\(4.Cut\)
inline void Cut(re int x,re int y){Evert(x);Access(y);Splay(y);fa[x]=*son[y]=0;pushup(y);}
\(5.Query\):查询\(x\)到\(y\)一些信息
inline int Query(re int x,re int y){Evert(x);Access(y);Splay(y);return **;}
Splay&LCT的更多相关文章
- 【BZOJ2002】 [Hnoi2010]Bounce 弹飞绵羊 分块/LCT
Description 某天,Lostmonkey发明了一种超级弹力装置,为了在 他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装 ...
- 王学长的LCT标程
善良的王学长竟然亲自打了一遍QAQ好感动QAQ #include<iostream> #include<cstdio> #include<cmath> #inclu ...
- bzoj2243-染色(动态树lct)
解析:增加三个变量lc(最左边的颜色),rc(最右边的颜色),sum(连续相同颜色区间段数).然后就是区间合并的搞法.我就不详细解释了,估计你已经想到 如何做了. 代码 #include<cst ...
- hdu4010-Query on The Trees(lct分裂合并加值查询最大值)
代码 #include<cstdio> #include<cstring> #include<string> #include<vector> #inc ...
- bzoj2049-洞穴勘测(动态树lct模板题)
Description 辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好 ...
- COJ 1006 树上操作
传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=979 WZJ的数据结构(六) 难度级别:D: 运行时间限制:1000ms: ...
- COJ 1008 WZJ的数据结构(八) 树上操作
传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=986 WZJ的数据结构(八) 难度级别:E: 运行时间限制:3000ms: ...
- COJ 1007 WZJ的数据结构(七) 树上操作
传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=983 WZJ的数据结构(七) 难度级别:C: 运行时间限制:1000ms: ...
- COJ 0981 WZJ的数据结构(负十九)树综合
WZJ的数据结构(负十九) 难度级别:E: 运行时间限制:3500ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 WZJ的数据结构中有很多都是关于树的.这让很多练习 ...
随机推荐
- pychram 激活码
转自博客:https://blog.csdn.net/may_ths/article/details/84032217 激活码到期时间: 2020.06 K6IXATEF43-eyJsaWNlbnNl ...
- 删除排序链表中的重复元素II --链表
题目 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 示例1 输入: ->->->->->-> 输出: ->-> ...
- SQL系列(九)—— 子查询(subQuery)
1.子查询 前面的系列介绍的都是简单的查询场景,其中都只涉及到单张表的数据检索.但是在日常是实际应用中,数据模型之间的关系都非常的复杂,数据的需求一般都是来源于多个数据模型之间的组合而成,即对应多张表 ...
- jar包部署脚本
部署一个名为xxx的jar包,输出到out.log,只需要准备以下脚本start.sh #!/bin/sh echo " =====关闭Java应用======" PROCESS= ...
- 可落地的DDD(3)-如何利用DDD进行微服务的划分
摘要 前面两篇介绍了DDD的目标管理.DDD的工程结构调整.这篇讨论微服务的划分.微服务是目前后端比较流行的架构体系了,那么如何做好一个微服务的划分?一个微服务的粒度应该是多大呢?这篇主要介绍如何结合 ...
- maven中pom的继承以及dependencies与dependencyManagement的区别
https://blog.csdn.net/zzm3280/article/details/84952623 分类专栏: maven 本文转自:https://blog.csdn.net/liut ...
- 8、VUE自定义组件
1.为什么要使用自定义组件? 自定义组件是用来封装复杂的内容,提高可重用性,比如封装复杂的表格组件.日历组件.图片轮播组件等. 2.自定义组件 2.1. 全局组件 全局组件是每个Vue对象都能使用的组 ...
- 将html中的内容生成PDF并且下载
<head> @*需要引用的js库*@ <script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/0. ...
- C#生成/调用动态链接库
参考地址:https://www.cnblogs.com/qq4004229/archive/2013/01/30/2882409.html 一.需求描述 (1)用代码生成动态链接库 (2)用C#代码 ...
- C# 接口、抽象类、以及事件
接口.抽象类,用于项目集成,如: Interface icls = appid == "A" ? new ClassA() : new ClassA();icls.func(&qu ...