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,一经查实,立即删除!

相关文章

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…

使用命令行导出 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 软件…

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

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

Dapper的正确使用姿势

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

[NewLife.XCode]百亿级性能

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

Web API 速率限制(一)

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

构建简单的微服务架构

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

读《代码整洁之道》

什么是整洁代码代码的质量非常重要,糟糕的代码有可能会毁了一个公司。对于一个很注重代码质量的人来说呆在一个只关注交付而不关注代码质量的公司是很痛苦的。什么是整洁的代码,不同的人又不同的定义。我认为整洁的代码应该是符合所使用语言代码规范的&a…

在 DotNetty 中实现同步请求

一、背景DotNetty 本身是一个优秀的网络通讯框架,不过它是基于异步事件驱动来处理另一端的响应,需要在单独的 Handler 去处理相应的返回结果。而在我们的实际使用当中,尤其是 客户端程序 基本都是 请求-响应 模型,在发送了数据时候…

ASP.NET Core 中间件

1.前言中间件(middleware)是一种装配到应用管道以处理请求和响应的组件。每个组件:●可选择是否将请求传递到管道中的下一个组件。●可在管道中的下一个组件前后执行工作。请求委托(request delegates)用于建立请求管道…

.Net Core实现的文档数据库RavenDb

说到文档数据库,大家能想到很多,MongoDb,coudDb。如果只是文档的话,甚至可以使用对象存储,阿里的oss,腾讯cos。但是这里小编选择这RavenDb,原因是对象存储下行太贵了(来自穷逼的绝望)。MongoDb据说非常占用…

Web Template Studio 发布!在 VS Code 中轻松创建 Web 应用

作为一个 Web 应用开发者,Scaffolding Tool(脚手架工具)一定是在创建项目时的重要工具。许多开发者会习惯于使用基于 CLI 的脚手架工具来创建 Web 应用,也有许多开发者喜欢使用类似于 VS IDE 的基于 UI 的 Wizard 向导。近期&…

再多迷茫,不如静下来好好学习

背景前不久,我有幸看到了CSDN知名博主“沉默王二”写的一篇博客《你的青春,值得先给小型创业公司吗?》,这篇博客介绍了他从苏州回到内地小城洛阳之后,虽然远离了互联网的主阵地,但是依然保持学习的态度&…

Web API 速率限制(二)- 令牌桶算法简介

前情提要上一篇文章里简单介绍了什么是Web API的速率限制,和限速策略需考虑的问题,最后还介绍了ASP.NET Core 的一个常用限速库。。。。。。。的名字。实施策略如果你想要建立一个限速系统,首先要确保限速系统不会增加API的响应时间。为了保证…

让 Ocelot 与 asp.net core “共存”

Intro我们的 API 之前是一个单体应用,各个模块的服务是通过 Assembly 集成在一起,最后部署在一个 web server 下的。我们已经在拆分服务并且在 Ocelot 的基础上封装了我们自己的网关,但是服务还没有完全拆分,于是有这么一个需求&a…

Xamarin中国峰会2019

Xamarin跨平台技术中国峰会将讨论Xamarin技术的国内最新发展和实践情况,在会议中领略现代化的开发模式、应用基础架构、企业应用转型和案例交流。本月26日,Xamarin中国峰会将以线上直播的形式和大家见面!直播时间:2019年5月26日 8:00—17:00直…