随笔分类 - 数据结构与容器
摘要:因为博主很懒,所以这里只是简单介绍 LCT 的原理,并不会配图讲解,主要是为了帮助博主日后理解 LCT,所以初学者请另找博客观看。 LCT 有一种树链剖分,分为两种链,实链和虚链,注意这个链是实是虚使我们认为规定的,也就是说我们从每个节点的向下连边中选出一条边来变成实边,其余边为虚边。注意在实际操作
阅读全文
摘要:回滚莫队,这种莫队在不能够删除或者不能够增加的时候使用。通常用于删除和插入只有一个复杂度能够接受的情况下使用,时间复杂度也是 O(n√n)。 下面我们以不插入莫队为例。 首先仍然是分块,如果询问左右端点都在同一个块内,那么我们直接暴力做就可以。我们也可以对整个快预处理,然后删除左
阅读全文
摘要:这里主要讲一下为什么 merge 函数需要新建节点的问题,以免以后忘掉。其他都是在分裂与更新的时候新建节点的问题。 这张图片是我们执行分裂后,9,4 分别是我们分裂出来的两颗子树。 然后我们考虑对 9,4 执行合并操作。因为 9,10,4 使我们新建的节点,所以我们他们的 \
阅读全文
摘要:[例题](【模板】二逼平衡树(树套树) - 洛谷) 我们首先分析一下,如果要查询前驱后继,我们就需要用到平衡树,但是平衡树储存不了区间信息,所以我们用线段树套平衡树,即线段树的每一个节点都是一个平衡树, 考虑如何实现以下操作: 求区间查询排名。 求区间查询某个排名的数。 把某个位置的数改成某个数。
阅读全文
摘要:左偏树 左偏树是一种可并堆,具有堆的性质,且可以快速合并。 dist 定义 对于一棵二叉树,我们定义外节点为左儿子或右儿子为空的节点,定义一个外节点的 dist 为 1,一个不是外节点的 dist 为其到子树中最近的外节点的距离加一。空节点的 dist 为 0
阅读全文
摘要:1 简介 multiset 是一个非常好用的 STL,简单来说就是一个可重集,可以允许序列重复。 2 声明 像其他所有 STL 一样,multiset 的声明是这样的:multiset<T> c,c1,c2; 其中 T 是一个类型,如果是结构体的话需要重载小于号。 3 操作 3.1 非变动性
阅读全文
摘要:bitset 1 简介 作为一个专门存储二进制的容器,bitset 的每一个位置只能用来存储 0,1 ,并且每一位只占一个 bit ,也就是说,每 8 位占一个字节,相比之下 bool 型一位 1 个字节,int 型一位 4 个字节。 2 声明 用 bitset 需要
阅读全文
摘要:广义后缀自动机 感觉挺水的,大致上和后缀自动机没有什么区别,只是加了几句特判。 1 离线做法 我们先对所有的字符串建一棵 Trie 树,然后对这颗 Trie 树建立后缀自动机。 如何建立呢?我们只需要对这颗 Trie 树进行 bfs 或 dfs ,不断往自动机里面加点就可以了。 唯一不同的是,节点的
阅读全文
摘要:二进制分组 1 简介 二进制分组是一类在线算法,其最大的功能是以一个 log 的代价,让一个需要支持动态修改的问题变成不需要支持动态修改的问题。 2 算法概述 做法是对修改序列分组,二进制位一组,在不断加入修改的过程中,不断维护这个二进制序列。对于一个询问,扫一下每一个二进制序列,用对于每一
阅读全文
摘要:离线算法入门——线段树分治 所谓线段树分治是一种离线算法,其主要思想是把时间当做序列,在上面建线段树,每一个修改操作的影响范围在线段树上呈现,叶子节点就放询问,这样我们把所有询问离线下来,就可以在 f(n)logn 的复杂度内完成对所有询问的回答。 线段树分治相比于其他离线算法来说,比较
阅读全文
摘要:离线算法入门——CDQ分治 1 简介 CDQ 分治只能算作一种方法而非一种通用的算法,对于一段操作序列,我们从中间分开,先处理左边,再处理右边,最后加上左边对右边的影响。归并排序实际上就是一个 CDQ 分治。 2 例题 2.1 三维偏序 链接 我们首先按照第一维从大到小排序。这样接下来我们只需要考虑
阅读全文
摘要:离线算法入门——整体二分 1 简介 整体二分是一类离线方法,适用于以下数据结构题: 询问的答案具有可二分性。 修改对判定答案的贡献相对独立,修改之间互不影响结果。 修改如果对判定答案有贡献,则贡献为一确定的与判定标准无关的值。 贡献满足交换律,结合律,具有可加性。 题目允许离线算法。 简单来说,你发
阅读全文
摘要:树状数组代码记录 因为发现树状数组除了代码已经忘干净了,所以放一张图。 不难通过图来理解。 #include<iostream> #define N 1000001 using namespace std; int a[N],c[N]; int n,m; int lowbit(int x) { re
阅读全文
摘要:可持久化并查集 说实在话,可持久化并查集在理解上没有太多困难,就是细节比较多,简单来说,所有在并查集上的对数组的操作全部变成在可持久化数组上的操作就可以了,下面我们一个一个函数的分析。 1 代码实现 首先给出例题链接:链接 1.1 定义 int n,m; struct node{ int l,r;
阅读全文
摘要:CF438D The Child and Sequence 线段树水题 链接 取模操作只需要暴力做就可以。我们只需要维护其最大值然后判断模数是否大于最大值,如果大于,那么就不用取模了,否则直接往下做。注意到每一个数最多被取模 log 次,复杂度最多不超过 nlog2109 要
阅读全文
摘要:线段树合并与分裂 注意:下面的操作基本上是对权值平衡树的操作,换句话说,线段树合并于分裂大部分是在权值线段树上运用的。 1 线段树合并 我们需要把两颗线段树合并,怎么做?首先可以把一棵线段树的值一个一个加入到另一颗线段树中,但是这样的复杂度是 O(nlogn),但是这样不优美,我们考虑把
阅读全文
摘要:树上问题入门——点分治 1 何为点分治 树上有三种分治,点分治,边分支,链分治,第三者就是我们通常所说树链剖分。 点分治是一种解决树上统计问题的常用方法,本质思想是选择一点作为分治中心,将原问题划分成几个相同的子树上的问题进行递归解决。 题目中常见给出的是无根树,即所需维护的信息与谁是根无关。 常见
阅读全文
摘要:自动机入门——后缀自动机 1 数据结构简介 后缀自动机是一个可以解决许多字符串相关问题的有力的数据结构,字符串的 SAM 可以理解为给定字符串的所有子串的压缩形式,SAM 的空间复杂度和构造的时间复杂度均为线性的,准确的说,一个 SAM 最多有 2n−1 个节点和 3n−4 条转移边。 2
阅读全文
摘要:AC 自动机 1 算法简介 AC 自动机是一个以 Trie 为基础结合 KMP 的思想建立的。在 AC 自动机中,每一个状态代表着某个模式串的前缀,而整个 DFA 的结构其实是所有模式串的 Trie 树。 而 AC 自动机可以处理这样一个问题:多模式匹配。即给你若干个模式串和一个主串,要求我们对每一
阅读全文
摘要:数据结构入门——猫树 1 简介 线段树的一种扩展,静态查询可以做到 O(nlogn) 的预处理,O(1) 的查询,但是不能扩展,只能解决特定问题,因此并不常用。 2 算法简介 猫树是一个线段树的结构,处理每一层的信息我们然后我们向下递归的去处理。 为了方便查询,我们把序列长度扩展
阅读全文