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}\)

\(\text{Blog}\)

定义:

一种用来解决动态树上问题的数据结构

\(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的更多相关文章

  1. 【BZOJ2002】 [Hnoi2010]Bounce 弹飞绵羊 分块/LCT

    Description 某天,Lostmonkey发明了一种超级弹力装置,为了在 他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装 ...

  2. 王学长的LCT标程

    善良的王学长竟然亲自打了一遍QAQ好感动QAQ #include<iostream> #include<cstdio> #include<cmath> #inclu ...

  3. bzoj2243-染色(动态树lct)

    解析:增加三个变量lc(最左边的颜色),rc(最右边的颜色),sum(连续相同颜色区间段数).然后就是区间合并的搞法.我就不详细解释了,估计你已经想到 如何做了. 代码 #include<cst ...

  4. hdu4010-Query on The Trees(lct分裂合并加值查询最大值)

    代码 #include<cstdio> #include<cstring> #include<string> #include<vector> #inc ...

  5. bzoj2049-洞穴勘测(动态树lct模板题)

    Description 辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好 ...

  6. COJ 1006 树上操作

    传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=979 WZJ的数据结构(六) 难度级别:D: 运行时间限制:1000ms: ...

  7. COJ 1008 WZJ的数据结构(八) 树上操作

    传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=986 WZJ的数据结构(八) 难度级别:E: 运行时间限制:3000ms: ...

  8. COJ 1007 WZJ的数据结构(七) 树上操作

    传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=983 WZJ的数据结构(七) 难度级别:C: 运行时间限制:1000ms: ...

  9. COJ 0981 WZJ的数据结构(负十九)树综合

    WZJ的数据结构(负十九) 难度级别:E: 运行时间限制:3500ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 WZJ的数据结构中有很多都是关于树的.这让很多练习 ...

随机推荐

  1. Java并发编程基础-Unsafe

    前言:Unsafe是Java中一个底层类,包含了很多基础的操作,比如数组操作.对象操作.内存操作.CAS操作.线程(park)操作.栅栏(Fence)操作,JUC包.一些三方框架都使用Unsafe类来 ...

  2. Java学习:线程池

    线程池 线程池概念:其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多的资源. 线程池:容器-->集合(ArrayList,Hash ...

  3. Java四种权限修饰符 在创建类中的使用

    四种权限修饰符 Java中有四种权限修饰符 public > protected > (default) >private 同一个类(我自己) YES YES YES YES同一个包 ...

  4. pandas 学习 第十一篇:处理缺失值

    Pandas中的缺失值是指nan.None和NaT.如果需要把inf 和 -inf视为缺失值,需要设置 pandas的选项: pandas.options.mode.use_inf_as_na = T ...

  5. .NET CORE webapi epplus 导入导出 (实习第一个月的笔记)

    最近有个需求就是网页表格里面的数据导出到excel  于是从各位前辈的博客园搜了搜demo  大部分非为两类 都是用的插件NPOI和Eppluse ,因此在这里就介绍Eppluse 用法,还有就是在博 ...

  6. 类例程_java战斗程序

    代码如下: package t11; import java.util.Random; public class Fight { String name; int life, attack, spee ...

  7. 在.Net Core中使用Swagger制作接口文档

    在实际开发过程中后台开发人员与前端(移动端)接口的交流会很频繁.所以需要一个简单的接口文档让双方可以快速定位到问题所在. Swagger可以当接口调试工具也可以作为简单的接口文档使用. 在传统的asp ...

  8. element-UI级联选择器(Cascader)获取label值 ,this.$refs['新组件名'].currentLabels 在2.7版本给移除了,新的解决方法。

    原文参考:https://blog.csdn.net/lijiabinbbg/article/details/97396812 遇到的新的问题是如果设置了ref,那么v-model绑定的值不会动态更新 ...

  9. [大数据学习研究] 错误排查,Hadoop集群部分DataNode不能启动

    错误现象 不知道什么原因,今天发现我的hadoop集群启动后datanode只有一台了,我的集群本来有三台的,怎么只剩一台了呢? 用jps命令检查一下,发现果然有两台机器的DataNode没有启动. ...

  10. js进度条源码下载—js进度条代码

    现在很多网站会用到进入网站特效,到网页没有加载完成的时候,会有一个loding特效,加载完了之后才能看到页面,今天就带着做一个js进度条效果,今天要做的效果是纯js进度条加载,没有用到框架,方便大家进 ...