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的数据结构中有很多都是关于树的.这让很多练习 ...
随机推荐
- Qt3D NodeInstantiator 使用时报出index out of range错误的记录
最近用到NodeInstantiator批量加入实体 刚开始用的时候一直程序崩溃 错误代码大致如下: // main.qml ApplicationWindow { ...... Loader { i ...
- PowerBuilder学习笔记之2PowerScript语言(一)
教材链接:https://wenku.baidu.com/view/1e82d26925c52cc58ad6be05.html?sxts=1565679996440 2.1PowerScript基础 ...
- 1.0EnterpriseFrameWork 框架学习
1.先报其主页 :博主的框架是开源的 http://www.cnblogs.com/kakake/p/3938262.html . 2.学习的精髓是:该框架支持 ORM.SQL语句 和 存储过程 ,O ...
- [Codeforces] Alex and a Rhombus
A. Alex and a Rhombus time limit per test 1 second memory limit per test 256 megabytes input standar ...
- 自定义WPF Popup控件
解决问题 1.WPF Popup 不随着 Window 一起移动的问题 2.WPF Popup 总是显示在最前面 引用命名空间 xmlns:ctrl="clr-namespace:Micro ...
- Date+闭包
date类: var time=new.date() get date() 返回一个月中的某一天 get day () 返回一周中的某一天 get fullyear() 对象以四位数返回年份 get ...
- Computer Neworking: A Top-Down Approach
目录 Chapter 1: Computer Networks and the Internet 1. What is the Internet? 2. The Network Edge 3. The ...
- vue组件6 使用vue添加样式
class绑定,内联样式 数组语法 :class="[stylename]" js:data{stylename:classname} 对象语法:class={stylena ...
- jQuery(五): Deferred
jQuery(五): Deferred 有啥用 通常来说,js请求数据,无论是异步还是同步,都不会立即获取到结果,通常而言,我们一般是是使用回调函数再执行,而 deferred就是解决jQuery的回 ...
- 解决在页面中无法获取qrcode.js生成的base64的图片
应用场景 生成带二维码的推广海报图片 旧方法: 将用户自己的推广连接先通过qrcode.js生成二维码,然后再用后台返回的一张背景图片和二维码通过canvas绘制成一张海报. 问题 在部分安卓手机上获 ...