Link-Cut Tree

Link-Cut Tree

概述.

LCT是一种支持动态维护树上路径信息的数据结构,其本质是实链剖分,通过其他数据结构维护实链的信息达到维护路径及一些子树信息的效果(通常为splay)

刚开始学的时候感觉很难,但做过几道题了解套路之后感觉还是一个很良心实用的东西QAQ。

实链剖分.

重链剖分把子树大小作为标准,子树结点个数最多的儿子作为重儿子。

长链剖分把子树深度作为大小,子树深度最大的儿子作为重儿子。

而实链剖分类似,但它的选择方式是动态的,相当于动态地把某些边设为实边,其他为虚边,并维护实链的信息,从而达到维护路径信息的效果。

LCT的实现.

Access是LCT的核心操作,它的作用是把某一个结点x到根的路径设为实链,并将x的儿子连向x的边设为虚边,相当于制造了一个只包含根到x的路径的实链。

这一操作可以通过不断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是一种维护树上数据的思想(实链剖分),它的时间复杂度  O(nlgn) 比树链剖分更加优秀,并支持动态维护树形结构,并且理解上不算困难,只要熟练掌握Splay就能轻松学会LCT了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315824.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2021-2022ACM赛季小总结

最近一个月比赛月,做题量和频率太高,写博客浪费时间,所以一直没写。。 当前总结: CCPC桂林铜,银牌题线段树差一行调出,可惜又无奈,缺少运气 ICPC沈阳铜,银牌题的tarjan没想出来&…

ASP.NET Core模块化前后端分离快速开发框架介绍

源码地址GitHub:https://github.com/iamoldli/NetModular演示地址地址:http://118.24.75.170:6220/账户:admin密码:admin前端框架演示地址(临时)地址:http://progqx5cu.bkt.clouddn.com/skins/index.html#/账户&#x…

[POJ2888] Magic Bracelet

[POJ2888] Magic Bracelet 题目描述 简要题意:给圆上个点染色,颜色有种,其中对颜色不能相邻,循环同构,多组数据,询问染色方案数。 Solution 大概就是一道挺显然的Burnside题(一般染色&#x…

手写编译器

假期没事想搞搞编译器,但学校课程未教过编译原理,自己只好在b站看了stanford的CS143《编译原理》,并结合相关资料,打算寒假期间自己手写一个简易的编译器 ReactjsbootStrap开发自制编译语言Monkey的编译器:创建简易的页…

使用命令行导出 SQL Server 数据层应用程序

点击上方蓝字关注“汪宇杰博客”我们可以使用 SSMS 导出 SQL Server 数据库的数据层应用程序。我在本地机器上使用这种方法已经有好几年了。如果不知道什么是 DAC,您可以参考 Microsoft 文档:https://docs.microsoft.com/en-us/sql/relational-databases…

Codeforces 1065 E. Side Transmutations

Codeforces 1065 E. Side Transmutations 题目描述 题意:一个字符串长度为,字符集大小为 ,再给出种交换方式,表示可以交换。如果两个不同的串能够通过任意的交换方式得到相同的串,则视为相同,求方案数。…

P1 用reactjs和bootstrap创建页面IDE

文章目录页面IDE展示:要求:安装好Node.jsreactjs组件化开发页面IDE展示: 要求: 希望能够达到eclipse辅助编程的功能 关键字提醒,高亮 1, 有类似C语言的语法结构 2, 支持变量绑定 3,…

所以Apache基金会不受美国法律约束?

开源中国昨天发布的一篇文章《开源界也要注意,Apache 基金会与 GitHub 都受美国法律约束》引发了开源届乃至整个 IT 行业的热烈讨论,其中有个别声音认为文章的说法有误,甚至制造了恐慌。文中我们引用了两处内容,分别是 Apache 软件…

Loj#6485. LJJ 学二项式定理

Loj#6485. LJJ 学二项式定理(单位根反演) 题目描述 题目描述 题意:求下面式子的答案QAQ。 [∑((ni)⋅si⋅aimod4)]mod998244353[\sum(\tbinom{n}{i}\cdot s^i \cdot a_{i\;\;mod\;\;4}) ]\;mod\;\;998244353 [∑((in​)⋅si⋅aimod4​)]mod…

团体程序设计天梯赛-练习集

团体程序设计天梯赛-练习集 L2-001 紧急救援 (25 分) 知识点&#xff1a;最短路dij #include<bits/stdc.h> #define debug(x,y) printf("%s %d\n",x,y); typedef long long ll; using namespace std; inline int read(){int s0,w1;char chgetchar();while(…

C#中的Explicit和Implicit了解一下吧

今天在研究公司项目框架的时候看到了下面的用法&#xff0c;public static implicit operator JsonData(int data);。貌似很久没用过这种隐式转换的写法了&#xff0c;因此重新温习一下C#中转换相关的知识。作者&#xff1a;依乐祝原文地址&#xff1a;https://www.cnblogs.com…

bzoj#2125. 最短路

bzoj#2125. 最短路 题目描述 Description 给一个N个点M条边的连通无向图&#xff0c;满足每条边最多属于一个环&#xff0c;有Q组询问&#xff0c;每次询问两点之间的最短路径。 Input 输入的第一行包含三个整数&#xff0c;分别表示N和M和Q 下接M行&#xff0c;每行三个整数v…

Dapper的正确使用姿势

本文demo适用于MySQL优点高性能、易排查、易运维、灵活可控缺点和EF相比&#xff0c;手写sql当修改表结构不易发现bug。习惯了EF后再来使用Dapper&#xff0c;会很难适应那种没有了强类型的安全感。不过可以用单元测和心细来避免。问题&#xff1a;IDbConnection需不需要手动Op…

P4064 [JXOI2017]加法

P4064 [JXOI2017]加法 题意&#xff1a; 题解&#xff1a; 要求找最小值尽可能大&#xff0c;很明显二分&#xff0c;现在是如何判断二分出来的答案的正确性 对于一个二分出来的答案mid&#xff0c;要求对k个区间进行操作后&#xff0c;最小值大于mid&#xff0c;我们可以这…

[NewLife.XCode]百亿级性能

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;支持nfx/netcore&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中&#xff0c;代…

LuoguP4606 [SDOI2018]战略游戏

LuoguP4606 [SDOI2018]战略游戏 题目描述 题目描述 省选临近&#xff0c;放飞自我的小 QQ 无心刷题&#xff0c;于是怂恿小 CC 和他一起颓废&#xff0c;玩起了一款战略游戏。 这款战略游戏的地图由 nn 个城市以及 mm 条连接这些城市的双向道路构成&#xff0c;并且从任意一个…

Jozky 刷题目录

文章目录本目录参考OI-Wiki还未解决专区算法基础枚举模拟递归&分治贪心排序前缀和&差分二分倍增构造搜索DFS && BFS双向搜索启发式搜索A*迭代加深搜索IDA*回溯法Dancing Links搜索优化&#xff08;剪枝&#xff09;动态规划普通dp背包dp区间dpDAG上的dp树形dp状…

Web API 速率限制(一)

导读当您API有大量消费者或者请求量猛增到影响程序可用性的时候&#xff0c;您可能需要对API进行速率限制。所以对API进行限速的在于&#xff1a;在增加可靠性和可用性的同时来保护基础架构&#xff0c;你不希望某个恶意的API消费者或者差劲的API客户端开发者通过Dos攻击把你的…

训练赛合集

带 # 的为未补 带△的为未补完 带※的为补不动 比赛合集 牛客 △2021年度训练联盟热身训练赛第一场 Codeforces Codeforces Round #694 Div. 2 △Codeforces Round #695 (Div. 2) Codeforces Round #696 (Div. 2) △CodeCraft-21 and Codeforces Round #711 (Div. 2) Codef…

构建简单的微服务架构

前言 本篇仅作引导&#xff0c;内容较多&#xff0c;如果阅读不方便&#xff0c;可以使用电脑打开我们的文档官网进行阅读。如下图所示&#xff1a;文档官网地址&#xff1a;docs.xin-lai.com目录总体介绍微服务架构的好处 微服务架构的不足&#xff08;这个时候…