Link-Cut Tree
Link-Cut Tree
概述.
LCT是一种支持动态维护树上路径信息的数据结构,其本质是实链剖分,通过其他数据结构维护实链的信息达到维护路径及一些子树信息的效果(通常为splay)
刚开始学的时候感觉很难,但做过几道题了解套路之后感觉还是一个很良心实用的东西QAQ。
实链剖分.
重链剖分把子树大小作为标准,子树结点个数最多的儿子作为重儿子。
长链剖分把子树深度作为大小,子树深度最大的儿子作为重儿子。
而实链剖分类似,但它的选择方式是动态的,相当于动态地把某些边设为实边,其他为虚边,并维护实链的信息,从而达到维护路径信息的效果。
LCT的实现.
Access是LCT的核心操作,它的作用是把某一个结点到根的路径设为实链,并将的儿子连向的边设为虚边,相当于制造了一个只包含根到的路径的实链。
这一操作可以通过不断splay来实现。
而实现了Access之后LCT的其他操作就能够轻松地实现了(详见下面的代码)。
struct Link_Cut_Tree {int ch[MAXN][2],rev[MAXN],size[MAXN],s[MAXN],fa[MAXN],a[MAXN],stk[MAXN],sz=0;void Clear(int x) { rev[x]=ch[x][0]=ch[x][1]=fa[x]=a[x]=0; }void Update(int x) { if (!x) return; s[x]=a[x]^s[ch[x][0]]^s[ch[x][1]]; } void Rev(int x) { if (!x) return; rev[x]^=1; swap(ch[x][0],ch[x][1]); }void Pushdown(int x){ if (!rev[x]) return; Rev(ch[x][0]); Rev(ch[x][1]); rev[x]=0; }bool Isroot(int x) { return ch[fa[x]][1]!=x&&ch[fa[x]][0]!=x; }int Get(int x) { return ch[fa[x]][1]==x; }void Rotate(int x) {int father=fa[x],grandfa=fa[father],which=Get(x);if (!Isroot(father)) ch[grandfa][Get(father)]=x;fa[x]=grandfa;ch[father][which]=ch[x][which^1],fa[ch[father][which]]=father;ch[x][which^1]=father,fa[father]=x;Update(father),Update(x);}void Splay(int x) { int top=1; stk[top]=x;for (int p=x;!Isroot(p);p=fa[p]) stk[++top]=fa[p];while (top) Pushdown(stk[top--]);for (int father;father=fa[x],!Isroot(x);Rotate(x)) if (!Isroot(father)) Rotate(Get(x)==Get(father)?father:x);}void Access(int x) { for (int p=0;x;p=x,x=fa[x]) Splay(x),ch[x][1]=p,Update(x); }void Make_root(int x) { Access(x),Splay(x),Rev(x); };int Find_root(int x) { Access(x),Splay(x); while (ch[x][0]) Pushdown(x),x=ch[x][0]; Splay(x); return x; }void Split(int x,int y){ Make_root(x),Access(y),Splay(y); }void Link(int x,int y) { Make_root(x); if (Find_root(y)!=x) fa[x]=y; }void Cut(int x,int y) { Make_root(x); if (Find_root(y)!=x||fa[y]!=x||ch[y][0]) return; fa[y]=ch[x][1]=0,Update(x); }int Query_Xor(int x,int y) { Split(x,y); return s[y]; }
} lct;
LCT的应用.
目前只在某谷上做了一些比较容易的题,之后再补充吧。
维护动态连通性:
- P3690 【模板】Link Cut Tree (动态树)
- P2147 [SDOI2008]洞穴勘测
动态维护生成树:
- P4234 最小差值生成树
- P2387 [NOI2014]魔法森林
类似LCT:
- P4338 [ZJOI2018]历史
一点总结.
与其说LCT是一种数据结构,不如说LCT是一种维护树上数据的思想(实链剖分),它的时间复杂度 比树链剖分更加优秀,并支持动态维护树形结构,并且理解上不算困难,只要熟练掌握Splay就能轻松学会LCT了。
Link-Cut Tree相关推荐
- 15行代码AC——Link/Cut Tree CodeForces - 614A(爆long long处理+快速幂讲解)
励志用少的代码做高效表达 Problem describe Programmer Rostislav got seriously interested in the Link/Cut Tree dat ...
- 模板:Link Cut Tree(LCT)
文章目录 前言 解析 原理 rotate(x) splay(x) access(x) findroot(x) makeroot(x) split(x,y) link(x,y) cut(x,y) pus ...
- Link Cut Tree 学习笔记
Link Cut Tree 学习笔记 说在前边 最近补 CF 碰见一道 LCT ,就打算学习一下这个东西...顺便复习一下 splay. 具体算法及实现 参考了FlashHu, Candy? P369 ...
- Link/Cut Tree学习笔记
最近正是实验课的高峰期,我数了一下,除了毛概没有实验课,其他的课都有实验课...不过好在这些实验都不是很难.我尽力挤出时间用来刷题. 简介 Link/Cut Tree和树链剖分很相似,二者处理的问题也 ...
- Link Cut Tree详解
Link Cut Tree ==Warning:千万不要跳读== 参考博客:https://www.cnblogs.com/flashhu/p/8324551.html 什么是动态树? 动态树问题, ...
- link cut tree 入门
鉴于最近写bzoj还有51nod都出现写不动的现象,决定学习一波厉害的算法/数据结构. link cut tree:研究popoqqq那个神ppt. bzoj1036:维护access操作就可以了. ...
- luogu P3690 【模板】Link Cut Tree (动态树)
嘟嘟嘟 LCT竟然看了整整一天,但好歹是看懂了. 教程这里不写,强烈推荐 闪狐大佬的博客 . 但是还是有几句想说的. 1.尽管LCT和splay很像,但是有一些细节还是不一样的.首先是rotate,我 ...
- Link Cut Tree学习笔记
捋一下思路 模板题:https://www.luogu.org/problemnew/show/P3690 推荐LCT的教程,个人认为很详细,本文做了部分引用:https://www.luogu.or ...
- 洛谷 - P3690 【模板】Link Cut Tree (动态树)(LCT模板)
题目链接:点击查看 题目大意:给出 n 个带权节点,需要执行 m 次操作,每次操作分为四种类型: 0 x y 代表询问从 x 到 y 的路径上的点的权值的 xor 和.保证 x 到 y 是联通的. 1 ...
- P3690-[模板]Link Cut Tree(动态树)【Splay】
正题 题目链接:https://www.luogu.org/problem/P3690 题目大意 nnn个点mmm个操作,要求支持 询问路径异或和 连接一条边(若x,yx,yx,y没联通) 删除一条边 ...
最新文章
- Boost:获取随机数的实例
- 使用DbContextPool提高EfCore查询性能
- leetcode 870.优势洗牌
- 微软语音识别技术屡破世界纪录的秘密都在这里了
- Apache Hudi 是Uber 大数据存储系统
- sql server 标准版升级专业版或者开发版没有sql server profiler
- 某高校校园网的规划与设计(课程设计)
- spssχ2检验_SPSS教程:分层卡方检验(CMH检验)
- java 动态统计报表_java统计图表FineReport制作动态图表
- C语言编程练习:定义判断素数函数int isPrime(int n);若n是素数返回1,否则返回0。调用isPrime函数,输出2~1000之内所有素数,按一行10个素数形式输出。
- 一名「数据分析师」职业思考与规划
- 史上最全APP推广渠道,看看你最熟悉哪一种
- 电脑变时钟,防止消息游戏新闻的打扰,形成高效率的办公和学习
- 黑白棋,又叫翻转棋(Reversi)、苹果棋或奥赛罗棋(Othello)。棋盘共有8行8列共64格。开局时,棋盘正中央的4格先置放黑白相隔的4枚棋子。双方轮流落子,只要落子和棋盘上任一枚己方的棋子
- linux内核mtd分区,linux内核MTD分区
- 关于antd Tree组件修改图标
- Lanenet 车道线检测网络模型学习(论文解读+官方模型)
- 嵌入式开发(三):海思Hi3559a交叉编译live555
- 【无标题】SimpleDateFormat,以及date的.parse()方法
- 一位算法工程师对自己工作的反思,写的不错。
热门文章
- 当女朋友学会「监视」男朋友......
- 第一次去四川的广东人是什么下场?
- 梦真的是反的 | 今日最佳
- 你和学霸的差距,不只是成绩
- 给新手程序员的16个工作必备小妙招,省下时间去LOL吧!
- 计算机管理无法连接虚拟磁盘服务,虚拟磁盘服务错误怎么操作【图文教程】
- java.awt.headless_以编程方式设置java.awt.headless = true
- ORACLE数据加载加本,使用oracle sqlldr加载数据
- eclipse连接mysql_专题一、flask构建mysql数据库正确姿势
- 游戏设计与计算机,RPG游戏设计与实现-数学与计算机系.doc