LCT 学习笔记】的更多相关文章

LCT学习笔记 前言 自己定的学习计划看起来完不成了(两天没学东西,全在补题),决定赶快学点东西 于是就学LCT了 简介 Link/Cut Tree是一种数据结构,我们用它解决动态树问题 但是LCT不叫动态树,动态树是指一类问题(那么LCT的中文名是啥啊) 这是⼀个和 Splay ⼀样只需要写几 (yi) 个 (dui) 核心函数就能实现一切的数据结构 动态树问题 维护一个森林,支持删除某条边,加入某条边,并保证加边,删边之后仍是森林.我们要维护这个森林的信息. 一般操作有两点连通性,两点路径权…
最近自学了一下LCT(Link-Cut-Tree),参考了Saramanda及Yang_Zhe等众多大神的论文博客,对LCT有了一个初步的认识,LCT是一种动态树,可以处理动态问题的算法.对于树分治中的树链剖分,只能处理静态的数据或者在轻重链上的边或点的权值,对于其他动态的处理就毫无办法了.因此我们就需要引入LCT这个东西.那么问题来了,LCT到底是什么呢?我弄了很久总算是理解了LCT,打算总结一下LCT的基本操作. ①浅谈对LCT的初步印象 LCT用来维护动态的森林,以及一些链上操作,是处理节…
\(emmm\)学\(lct\)有几天了,大概整理一下这东西的题单吧 (部分参考flashhu的博客) 基础操作 [洛谷P1501Tree II] 题意 给定一棵树,要求支持 链加,删边加边,链乘,询问链权值 四种操作. Sol: 大概是 \(lct\) 上维护加和乘标记的板子题 [SHOI2014 三叉神经树] 题意 给定一棵 $ 3\times n$ 个节点的树,编号在 \(1\sim n\) 的节点有且仅有三个儿子,编号在\(n+1\sim 3\times n\)的节点没有儿子.节点的值只…
这应该暂时是个终结篇了... 最后在这里讨论LCT的一个常用操作:维护虚子树信息 这也是一个常用操作 下面我们看一下如何来维护 以下内容转自https://blog.csdn.net/neither_nor/article/details/52979425 对于一个点x,如果我们对x进行access操作,那么他的虚子树内将包含且仅包含他原树中子树内除了他自己以外的所有点,这时如果我们维护了他的虚子树信息和,我们把这个信息与他自己的信息合并,我们就得到了他在原树中的子树信息 在下面的讨论中,我们发…
这一篇重点探讨LCT的应用 例:bzoj 2631 tree2(国家集训队) LCT模板操作之一,利用SPLAY可以进行区间操作这一性质对维护懒惰标记,注意标记下传顺序和如何下传 #include <cstdio> #include <cmath> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> #include <qu…
前三篇好像变成了SPLAY专题... 这一篇正式开始LCT! 其实LCT就是基于SPLAY的伸展操作维护树(森林)连通性的一个数据结构 核心操作有很多,我们以一道题为例: 例:bzoj 2049 洞穴勘测 要求:加边和删边,询问连通性 其实如果没有删边,裸跑并查集似乎就可以搞定 但由于存在删边,并查集思想受阻,我们要考虑更高级的数据结构 于是LCT横空出世! LCT的核心思想:多棵SPLAY维护虚实树链 首先介绍一下树链剖分问题: 树链剖分问题是将一棵树划分成多条树链的思想,有很多种剖分方法,比…
写了两周数据结构,感觉要死掉了,赶紧总结一下,要不都没学明白. SPLAY专题: 例:NOI2005 维修数列 典型的SPLAY问题,而且综合了SPLAY常见的所有操作,特别适合新手入门学习(比如我这种蒟蒻) 题目要求很多,我们一步一步来分析 首先,区间翻转是SPLAY一个很基础的操作,我们以他为基础分析这个SPLAY 例:luogu文艺平衡树 题目:读入一个序列,进行多次区间翻转操作,请你输出操作后的序列 我们怎么处理呢? 首先要明确一点,就是SPLAY是可以当做区间树来使用的(就像线段树一样…
我居然还不会LCT QAQ真是太弱了 必须学LCT QAQ ------------------线割分是我www------------ LinkCut-Tree是基于Splay(由于Splay能够非常快的支持合并和分离,当然fhqTreap也能够可是复杂度会多一个log)的一种动态维护树的权值形态的方法.基本做法是基于轻重链(注意这里的轻重链和树链剖分的轻重链定义并不一样)将树分成若干Splay森林,然后对这个Splay森林进行各种鬼畜的操作. 由Sleator和Tarjan发明,操作和查询的…
前两篇讲述了SPLAY模板操作,这一篇稍微介绍一下SPLAY的实际应用 (其实只有一道题,因为本蒟蒻就写了这一个) 例:bzoj 1014火星人prefix 由于本蒟蒻不会后缀数组,所以题目中给的提示完全没看懂 不过并不影响我们做这道题,因为正解好像不用后缀数组... 首先,如果这题没有插入和修改,那么我们只需二分+hash即可 (很显然,二分相同前缀的长度,用hash检查是否合法) 可是这题有插入修改,单纯hash搞不了 所以我们应用SPLAY维护hash值即可 查找时同样二分 #includ…
能够看到,上一篇的代码中有一段叫做find我没有提到,感觉起来也没有什么用,那么他的存在意义是什么呢? 接下来我们来填一下这个坑 回到我们的主题:NOI 2005维修数列 我们刚刚讨论了区间翻转的操作方法,接下来我们来考虑区间插入和区间删除的方法. 有了上一篇的铺垫,大家应该能看都,这两个操作方法是一致的,就是将区间前驱转到根,后继转到根的右节点. 所以当我们插入一段区间的时候,我们还是把这个区间的前驱和后继转上去,然后把这段区间插到左子树就可以了 等等,怎么插? 一个一个往上扔? 这显然是不合…