随笔分类 - 数据结构
摘要:爆改了之前文艺平衡树的板子。 [luoguP2710 数列](https://www.luogu.com.cn/problem/P2710) 大致题意: 维护数列,支持 插入、删除、区间翻转、区间覆盖、区间求和、区间最大子段和。 code: (头文件等略) ```cpp const int maxn
阅读全文
摘要:(DS 记录) problem: [luoguP3437 [POI2006]TET-Tetris 3D](https://www.luogu.com.cn/problem/P3437) 题意:矩形覆盖矩形最大值。(保证每个位置的值单增,这样可以用标记永久化处理) 板子。内层线段树维护列,外层线段树维
阅读全文
摘要:semi-AFO 选手的 DS 记录( 您将在这里见到最垃圾的扫描线写法. ## 1. 面积 扫描线本身还是很好理解的. 偷一张图 (图源 [OI-wiki](https://oi-wiki.org/geometry/scanning/)) -O(n^{1/2}) (修改-询问). 然后你发现这太慢了. 于是你考虑改一下分块的大小. 我们更改块的大小为 n^{2/3}, 整块的复杂度成功变成了 O(n^{1/3})! 但是散块的复杂度变成了 $O(n
阅读全文
摘要:(日常口胡) 参考资料:luogu日报 LA 模板题解 一个能把 LCA,RMQ 和 LA 问题做到线性的奇怪技巧。 大概就是分块,块的大小为 O(\log n),然后整块用原算法,块内可以直接枚举所有可能情况(反正块的大小只有对数级)。 前置知识:ST表做 RMQ,欧拉环游序 LCA 转 RM
阅读全文
摘要:(水) struct point{int l,r,val1,val2/*要维护的信息*/,tag1,tag2/*标记*/;}tree[maxn<<2]; point pushup(point x,point y,int tg1,int tg2/*标记传进来*/) { point ans; if(x.
阅读全文
摘要:最后我们来介绍B树和其衍生出的(左偏)红黑树。 B树和红黑树的图源自这个网站,你也可以在上面找到一些其他的数据结构。 左偏红黑树的图源自这个slide、OI-wiki(删除操作)和这里。 1. B树 我们发现二叉树做不到绝对平衡。于是我们考虑多叉树。 B 树(也叫B-树)就是一种完全平衡的多叉树,也
阅读全文
摘要:笛卡尔树就是每个结点有两个值 val 和 key,其中 val 满足 BST 的性质而 key 满足堆的性质。treap 就是一棵笛卡尔树。 可以证明给定 val 和 key 的前提下笛卡尔树的形态是唯一的。 很明显借助于平衡树的知识我们能 O(n\log n) 进行构建。 但是,当给定的元素已
阅读全文
摘要:fhq_treap 和 Splay 之外的平衡树的代码是不可能写的。仅供学术研究,所以只有口胡,没有代码。 1. 旋转treap 学过 fhq_treap 的都知道 treap 是啥吧( 但是 treap 也可以用旋转来维护。 插入操作: 这是显然的,找到位置插入以后,把结点一路转上去,直到父亲结点
阅读全文
摘要:模板题:LOJ133 就是区间上的问题搬到了矩阵上。 但其实矩阵上的问题处理起来并不容易。比如这道题,涉及矩阵最大值,必须采用二维线段树(线段树套线段树)的方式进行维护,非常繁琐。 但对于LOJ133这道题,因为只有单点修改区间求和,所以考虑使用二维树状数组,即树状数组套树状数组。而二维树状数组写起
阅读全文
摘要:注意:本文全程口胡。暂时没有代码。 猫树,出自immortalCO的博客,是“一种高效处理无修改区间或树上询问的数据结构”。 ~~lxl说他自己反对用猫树这个名字,并且认为这个名字就像ODT一样奇怪,可能叫“二区间合并”更好一些~~ 首先我们要明确猫树能干什么。 就如immortalCO的博客的标题
阅读全文
摘要:前置知识:普通平衡树。 实际上,平衡树能做到的操作不只有插入删除,查排名查值,前驱后继这些。 如果我们把平衡树移到区间上,我们甚至能够支持比线段树更强的操作——区间翻转。 这就是文艺平衡树这道题了。 1. 区间树 首先我们来明确一下区间树的概念。 顾名思义,区间树就是用来维护区间的。 具体地,我们规
阅读全文
摘要:之前写过 Splay 的介绍。那么接下来就是对于 fhq_treap 的介绍了。 0. 引子 dalao云:“treap,tree+heap 也。” treap 是一个同时具有 tree(即BST)和 heap 的特点的平衡树。 具体地说,我们会对每个节点随机一个 key 值,然后要求这棵 BST
阅读全文
摘要:0. 前言 前置知识:二叉查找树(BST)。 我们知道,BST 是会被恶意数据卡成O(n^2)的。(如下图) 树变成了一条链,这很显然不是我们想要的,我们需要找到一种方法来让 BST 保持平衡。 于是我们就有了各式各样的平衡树,而在 OI 中应用最为广泛的就是 Splay 和 fhq_treap
阅读全文
摘要:树上的许多问题都可以用dfs序+线段树予以解决。 轻重链剖分是通过优化dfs的顺序,达到优化时间复杂度的目的。 它可以O(n\log^2n)支持链上加,链上和还有O(n\log n)LCA,子树加,子树和。 前置知识:dfs序,树形dp,线段树,没了。 首先给出一些定义: 重儿子:子树大小最
阅读全文
摘要:UVA11987(vjudge) 并查集神题。也是在这里头一次听说了并查集的删除操作。 题目大意: 要求支持3个操作: 合并x,y所在集合; 将x移到y所在集合; 查询x所在集合中元素的个数和元素的和。 如果只有1、3操作,那么这道题就是一道简单的并查集。 现在有了2操作,那么就需要
阅读全文
摘要:感觉自己对这种数据结构理解的一直不是很好…… 于是就有了这一篇。相信所有人都能看懂( 符号约定: 对于队列,使用[表示队首,使用]表示队尾。 对于栈,使用<表示栈顶,使用]表示栈底。 1. 单调队列 1.1 什么是单调队列 顾名思义,“单调队列”就是队列内元素满足单调性的队列。 比如下面这三个队列:
阅读全文
摘要:不包括字符串和图论内容。 代码压行警告qwq 如果存在与数据结构有关的经典算法,也会予以列出。 1. 单调队列 O(n) luoguP1886 单调队列和单调栈的讲解在这里 const int maxn=1000010; int n,k,cnt,a[maxn],minans[maxn],maxa
阅读全文
摘要:有用的参考资料: hzwer分块九讲 分块九讲提交 分块是一种优美的暴力算法。 其思想为将数组分为若干块,修改、查询时将整块一起处理,而对剩余的元素,即散点进行暴力处理,以优化时间复杂度。 同时,分块的适用性更加广泛,可以解决插入元素,区间众数等线段树所不能解决的操作。 假设数组长度为 n,而分
阅读全文
摘要:##一、ST表 ~~最没用的一种~~,一般只用于静态区间RMQ(无修改,查询区间最大/最小值)。 (gcd 也能做, 只要能重复贡献就行 (也就是重复计算不会影响结果) ) 但是ST表的查询操作复杂度异常优秀,能做到O(1),这是其它数据结构难以做到的。 ST表的思路大致就是用一个二维数组$f[
阅读全文
