首页 > 其他分享 >Link-cut Tree

Link-cut Tree

时间:2024-01-25 22:24:34浏览次数:23  
标签:access cut return int void Tree splay Link 节点

这可能是我第一次学数据结构如此绝望

链剖分

重链剖分

使用静态数据结构维护

实链剖分(LCT)

使用splay维护

对每个节点,选择一个儿子作为实边,其他为虚边
实链用splay维护

虚边认父不认子,连接两个splay

长链剖分

查询修改链上信息

随意换根

动态维护连通性

LCT核心操作

access(x)

从指定节点到根节点,自下往上,打通根节点到指定节点的实链,是的一条从根开始指定节点结束的splay出现

splay旋转路径上对于有实变得点,让他变虚,对于x路径上的点变重。把要改虚的边用旋转去掉。

splay是二叉树,在splay上进行操作

  • 转到根 splay
  • 换儿子
  • 更新信息
  • 当前操作节点切换到轻边所指的父节点

splay按深度排序,只会在右边,不会在左边

以深度为关键信息的BST

void access(int x){
    for(int y=0;x;y=x,x=f[x]){
        splay(x);
        c[x][1] = y;
        pushup(x);
    }
}

makeroot(x)

将 x 变成原树的根

access(x)

splay(x)

反转整个splay,所有点的深度倒过来

x没有左子树

void rev(int x){
    swap(c[x][0],c[x][1]);
    r[x] ^= 1;
}
void makeroot(int x){
    access(x);
    splay(x);
    rev(x);
}

findroot(x)

access(x)

x与根在同一个splay中

splay(x)后根在x的最左子节点

要pushdown()

void pushdown(x){
    if(r[x]){
        if(c[x][0])rev(c[x][0]);
        if(c[x][1])rev(c[x][1]);
        r[x]=0;
    }
}
int findroot(int x){
    access(x);
    splay(x);
    while(c[x][0]){
        pushdown(x);
        x=c[x][0];
    }
    splay(x);
    return x;
}

split(x,y)

将x到y的路径放到一个单独的splay中

void split(int x,int y){
	makeroot(x);
	access(y);
	splay(y); 
}
bool link(int x,int y){
    makeroot(x);
    if(findroot(y)==x)return false;
    f[x]=y;
    return true;
}
void link(int x,int y){
    makeroot(x);
    fa[x]=y;
}

cut

将x-y边断开

void cut(int x,int y){
    split(x,y);
    f[x]=c[y][0]=0;//做了access操作
    pushup(y);
}
bool cut(int x,int y){
    makeroot(x);
    if(findroot(y)!=x)return false;
    if(f[y]!=x)return false;
    if(c[y][0])return false;
    f[y]=c[x][1]=0;
    pushup(x);//具体题目具体分析
    return true;
}

时间复杂度

势能分析,单次 access(x) 操作 \(O(\log n)\)

判断它是不是当前的根

//不会splay怎么办,学,资源很多

splay修改l,r,但是提根要提l-1,r+1

标签:access,cut,return,int,void,Tree,splay,Link,节点
From: https://www.cnblogs.com/life-of-a-libertine/p/17988318

相关文章

  • C# AVEVA MARINE DRAWING TREE VIEW 快速读取方法,速度真的很快
    一般来讲我们使用MARAPI里面的ElementChildFirstGet和ElementSiblingNextGet函数去遍历而获得图元'''<summary>'''获取当前视图的全部的子视图的句柄'''</summary>'''<paramname="draftApp">M......
  • ABC337G Tree Inversion
    思路对于每个\(1\lei\len\)的\(i\)都要求答案,那我们考虑dp,去思考如何转移\(f_i\)。先不考虑全局,只考虑子树内的贡献,设\(g_u\)表示以\(u\)为根的子树内,对\(u\)来说满足条件的点对数。对于\(u\)的儿子\(v\),对\(v\)来说合法那么对\(u\)来说也一定合法。因为......
  • openGauss学习笔记-207 openGauss 数据库运维-常见故障定位案例-btree 索引故障情况下
    openGauss学习笔记-207openGauss数据库运维-常见故障定位案例-btree索引故障情况下应对策略207.1btree索引故障情况下应对策略207.1.1问题现象偶发索引丢失错误,报错如下。ERROR:index'xxxx_index'containsunexpectedzeropage或ERROR:index'pg_xxxx_index'cont......
  • 《Visual Tree Convolutional Neural Network in Image Classification》阅读笔记
    论文标题《VisualTreeConvolutionalNeuralNetworkinImageClassification》图像分类中的视觉树卷积神经网络作者YuntaoLiu、YongDou、RuochunJin和PengQiao来自国防科技大学并行和分布式处理国家实验室初读摘要问题:在图像分类领域,随着深度学习的快速发展,卷......
  • AppLink让你的电商运营财务管理自动化
    电商运营财务管理的现状在我们做电商运营管理的时候,财务管理是一个很繁琐并且对精度要求比较高的工作。通常需要花费财务管理人员很长的时间和经理进行核对。企业电商金额大,商品多。个体电商人员少,精力更多在运营以及营销方面。解决方案使财务管理自动化成了很多企业个体电商的首要......
  • AppLink让你的电商运营财务管理自动化
    电商运营财务管理的现状在我们做电商运营管理的时候,财务管理是一个很繁琐并且对精度要求比较高的工作。通常需要花费财务管理人员很长的时间和经理进行核对。企业电商金额大,商品多。个体电商人员少,精力更多在运营以及营销方面。 解决方案使财务管理自动化成了很多企业个体电......
  • centos 离线安装tree命令
    在线安装tree命令:yum-yinstalltree 但是在线包总是下载失败:RepositoryepelislistedmorethanonceintheconfigurationRepositoryepel-debuginfoislistedmorethanonceintheconfigurationRepositoryepel-sourceislistedmorethanonceinthecon......
  • Electron 解决 connect ETIMEDOUT 或 sill idealTree buildDeps
    参考https://blog.csdn.net/Johanna51/article/details/123360477https://www.electronjs.org/zh/docs/latest/tutorial/installationhttps://cloud.tencent.com/developer/article/1781066环境环境版本说明Windows10nodev20.11.0npm10.2.4Windows......
  • LinkedList(Deque)中添加/删除方法
    转:https://www.jianshu.com/p/ae28d514003c 1简介最近在使用LinkedList/Deque的时候,发现其中有很多类似的方法,我就想简简单单做个添加/删除的操作,发现竟然有那么多类似的方法,比如“添加”操作可以用的方法有:add/offer/push/offerFirst/offerLast,“删除”操作可以用......
  • Permission denied: user=hive, access=EXECUTE, inode=“/tmp“:root:supergroup:drw
    在执行Hadoop的创建目录、写数据等情况,可能会出现该异常,而在读文件的时候却不会报错,这主要是由于系统的用户名不同导致的,由于我们进行实际开发的时候都是用Windows操作系统,而编译后的JAVA程序是部署在Linux上的。而Windows的用户名一般都是自定义的或者是administrator,Linux的用户......