ACM--数据结构
文章平均质量分 74
ACM--数据结构
「已注销」
“没有人能把你变好,
时间和经历只是陪衬。
支撑你变得越来越好的,是你坚强的意志、修养、品行,以及不断的反思和修正。”
展开
-
可持续化数组
文章目录可持续化数组1.算法分析3.典型例题可持续化数组1.算法分析3.典型例题P3919 【模板】可持久化线段树 1(可持久化数组)题意: 如题,你需要维护这样的一个长度为 N 的数组,支持如下几种操作在某个历史版本上修改某一个位置上的值: vi 1 loci valueiv_i\ 1\ loc_i\ value_ivi 1 loci valuei, 即为在版本viv_ivi的基础上,将 alocia_{{loc}_i}a原创 2021-07-23 14:14:14 · 117 阅读 · 0 评论 -
分块与块状链表
文章目录分块与块状链表1. 算法分析1.1 分块思想1.2 块状链表2. 板子2.1 分块2.2 块状链表3. 例题2.1 分块2.2 块状链表分块与块状链表1. 算法分析1.1 分块思想分块思想就是将整体分为n\sqrt nn个长度为n\sqrt nn的区间,这样区间修改和查询的复杂度从O(n)O(n)O(n)降为了O(n)O(\sqrt n)O(n)维护两个数组:add代表本段中的所有数都要加上add,sum代表本段的真实和是多少(算上了add)修改一个区间时,分为完整段的区间修改以及原创 2021-07-23 14:13:40 · 526 阅读 · 0 评论 -
堆数据结构小结
文章目录堆1.算法分析2.模板3.典型例题堆1.算法分析down(x)函数:从x开始往下使用筛选法调整堆,up(x)函数:从x开始往上使用筛选法调整堆堆的基本操作(以小根堆为例):1.插入一个数: heap[++size] = x; up(size)2.求集合当中的最小值:heap[1]3.删除最小值:heap[1] = heap[size];size–;down(1)4.删除任意一个元素:heap[k] = heap[size];size–;down(k) or up(k) (比原位置的数原创 2021-07-23 14:11:57 · 175 阅读 · 0 评论 -
势能线段树
文章目录势能线段树1.算法分析2.典型例题2.1 区间与t取min/询问区间max2.1 区间加 /区间对 取 /区间对 取 /求区间和/求区间最大值/求区间最小值势能线段树1.算法分析本文章目的主要是为了留个区间取max/min的模板,代码参考:https://oi-wiki.org/ds/seg-beats/#hdu5306-gorgeous-sequence2.典型例题2.1 区间与t取min/询问区间maxHDU5306 Gorgeous Sequence题意: 维护一个长度为n(1e原创 2021-03-23 18:18:16 · 467 阅读 · 0 评论 -
二维线段树
文章目录二维线段树1.算法分析1.1 四叉树写法1.2 树套树写法2.模板2.1 四叉树写法:单点修改,区间询问2.2 树套树写法:单点修改,区间询问3.典型例题二维线段树1.算法分析对于二维的线段树,有2种写法,分别为四叉树写法和树套树写法:1.1 四叉树写法参照一维线段树的写法:每次将区间二分成两个子区间,对应矩阵应对X,Y同时二分,也就是4个子矩阵,即左上、右上、左下,右下四部分,所以要建一颗四叉树,如果当前矩阵为一维时,只需二分成两个子区间。具体写法和一维线段树类似,可以查看代码1.2原创 2021-03-23 12:47:44 · 1962 阅读 · 0 评论 -
启发式合并
文章目录启发式合并1.算法分析1.1 一般启发式合并1.2 树上启发式合并1.2.1 先走轻边的启发式合并距离1.2.2 set类型2.模板3.典型例题3.1 一般启发式合并3.2 树上启发式合并启发式合并1.算法分析1.1 一般启发式合并启发式合并指的是,对于两个集合x和y合并的操作,每次把元素个数更少的集合合并到元素个数更大的集合内,即:设x为元素更少的集合,那么就把x合并到y内。可以证明,启发式合并的时间复杂度为:O(nlogn)O(nlog_n)O(nlogn),因为对于每个元素,他所处原创 2021-03-17 13:13:25 · 6138 阅读 · 3 评论 -
Treap
文章目录Treap1.算法分析2.模板3.典型例题Treap1.算法分析2.模板#include <bits/stdc++.h>using namespace std;const int N = 100010, INF = 1e8;int n;struct Node { int l, r; int key, val; // key是存储的值,val是heap分配的值,用来维护heap的性质 int cnt, size; // cn原创 2021-03-17 11:02:06 · 59 阅读 · 0 评论 -
splay
文章目录splay1.算法分析2.模板3.典型例题splay1.算法分析 Splay 是一种二叉查找树,它通过不断将某个节点旋转到根节点,使得整棵树仍然满足二叉查找树的性质,并且保持平衡而不至于退化为链。 为了使得splay保持平衡,进行旋转操作。旋转需要保证 :整棵 Splay 的中序遍历不变(不能破坏二叉查找树的性质)。受影响的节点维护的信息依然正确有效。root 必须指向旋转后的根节点。splay保证复杂度的操作的核心是:每次操作完一个节点,均将该节点旋转至树根spla原创 2021-03-17 11:01:30 · 150 阅读 · 0 评论 -
珂朵莉树
珂朵莉树1. 算法分析玄学原理 用一个三元组(l, r, val)记录一个区间,set来存储。每次区间赋值操作可以把一段区间[l, r]快速赋值为一个值,把[l, r]这段区间内的所有子区间合并为一个区间{l, r, x}。由于数据随机,[l, r]的期望长度为$ \frac{ 1 }{ 3 } (r - l + 1),即每次赋值操作会使得set的区间个数变为原来的,即每次赋值操作会使得set的区间个数变为原来的,即每次赋值操作会使得set的区间个数变为原来的 \frac{ 2 }{ 3 } $原创 2021-03-17 10:59:44 · 106 阅读 · 0 评论 -
链式前向星
文章目录链式前向星1.算法分析2.模板3.典型例题链式前向星1.算法分析本质上是单链表的头插法建表使用数组模拟,假设x与1, 2, 3, 4相连,使用一个链表来存储它们之间的关系,-1作为结尾的标志,h[x]为该链表的头结点,如下图:每次插入一个结点的方法如下:注意: 每插入一个点,这个点会在链表的表头,h[x]h[x]h[x]始终指向表头,−1-1−1是表尾。2.模板初始化memset(h, -1, sizeof h); // 初始化加入结点到头部// idx:用来唯一标识一条原创 2021-03-17 10:59:10 · 143 阅读 · 0 评论 -
主席树
文章目录主席树1.算法分析2.模板2.1 区间静态第k小2.2 区间动态第k小2.3 树上第k小2.4 魔改2.4.1 区间小于x的最大值2.4.1 区间mex2.4.2 区间互为因子或者倍数的对数2.4.3 主席树+差分3.典型例题3.1 区间静态第k小3.2 区间动态第k小3.3 树上路径第k小主席树1.算法分析 主席树借用前缀和+节约空间的思想, 建立n棵权值线段树,对于[l, r]区间的所有数字,就是第r棵权值线段树-第l-1棵权值线段树,然后查询第k小的时候按照权值线段树查询的思路查询。原创 2021-03-16 16:21:33 · 203 阅读 · 0 评论 -
权值线段树
文章目录权值线段树1.算法分析1.1 特点1.2 技巧2.模板3.典型例题权值线段树1.算法分析1.1 特点维护全局的值域信息,每个节点记录的是该值域的值出现的总次数。使用二分的思想(离散化的时候,需要用到)支持查询全局K小值,全局rank,前驱,后继等。单词操作时间复杂度为O(logn)空间复杂度为O(n)相对于平衡树的优势:代码简单,速度快劣势:值域较大时,我们需要离散化,变成离线数据结构写起来时和普通的线段树基本一样,但是不需要build建树操作。每次插入一个数字x,相当于执原创 2021-03-14 00:15:15 · 302 阅读 · 0 评论 -
树链剖分
文章目录树链剖分1.算法分析1.1 重链剖分:1.1.1 定义1.1.2 重链剖分的性质1.1.3 常见应用1.2 长链剖分1.2.1 定义1.2.2 长链剖分性质1.2.3 长链剖分应用2. 板子2.1 重链剖分2.1.1 权在点上2.1.2 权在边上2.2 长链剖分2.2.1 求lca/求每条长链的长度2.2.2 查询一个点的k级祖先2.2.3 O(n)处理可合并的与深度有关的子树信息3. 例题3.1 重链剖分3.2 长链剖分树链剖分1.算法分析dfs1函数:这里要注意根节点不能设为0,否则根节点原创 2021-03-06 00:09:34 · 129 阅读 · 0 评论 -
点分治
文章目录点分治1.算法分析2.模板3.典型例题点分治1.算法分析点分治适合处理大规模的树上路径信息问题。所谓点分治,一般的思想如下:我们先随意选择一个节点作为根节点 rtrtrt,所有完全位于其子树中的路径可以分为两种,一种是经过当前根节点的路径,一种是不经过当前根节点的路径。对于经过当前根节点的路径,又可以分为两种,一种是以根节点为一个端点的路径,另一种是两个端点都不为根节点的路径。而后者又可以由两条属于前者链合并得到。所以,对于枚举的根节点 rtrtrt,我们先计算在其子树中且经过该节点的路径对原创 2021-02-26 22:54:41 · 262 阅读 · 0 评论 -
替罪羊树
文章目录替罪羊树1.算法分析2.模板3.典型例题替罪羊树1.算法分析替罪羊树 是一种依靠重构操作维持平衡的重量平衡树。替罪羊树会在插入、删除操作时,检测途经的节点,若发现失衡,则将以该节点为根的子树重构。重构的操作是先做一遍中序遍历,然后按照中点分治拎起来。2.模板// 该模板删除操作时必须保证树内有这个点#include <bits/stdc++.h>using namespace std;int const N = 1e5 + 10;const double alpha原创 2021-01-06 02:15:28 · 202 阅读 · 0 评论 -
单调队列
文章目录单调队列1.算法分析2.模板3.典型例题单调队列1.算法分析单调队列可以维护一个滑动窗口的最大值和最小值2.模板#include <bits/stdc++.h>using namespace std;int const N = 1e6 + 10;int tt, hh, a[N], q[N];int main() { int n, k; scanf("%d %d", &n, &k); for (int i = 0; i <原创 2021-01-06 02:06:00 · 89 阅读 · 0 评论 -
线段树
文章目录线段树1.算法分析2.板子2.1 单点修改+区间查询2.2 区间修改+区间查询2.3 区间加乘操作2.4 区间染色2.4.1 有限染色问题2.4.2 一般染色问题2.5 区间开根号2.6 区间合并2.6.1 最大连续子段和2.6.2 最大连续区间2.7 区间每个数字的平方和、立方和2.8 扫描线求矩形面积并3. 例题3.1 常规操作题3.2 特殊构造题线段树1.算法分析一般还要开4N的数组一般做单点修改、区间查询,加上懒标记后,可以做区间修改、区间查询可以处理:区间加、区间乘、区间ma原创 2021-01-06 02:04:07 · 140 阅读 · 0 评论 -
KD树
文章目录KD树1.算法分析1.1 建树1.2 插入/删除1.3 查询2.模板3.典型例题KD树1.算法分析本文大部分内容来自:https://oi-wiki.org/ds/kdt/k-D Tree(KDT , k-Dimension Tree) 是一种可以 高效处理 维空间信息 的数据结构。用来处理询问空间最近点对的问题。1.1 建树k-D Tree 具有二叉搜索树的形态,二叉搜索树上的每个结点都对应 k 维空间内的一个点。其每个子树中的点都在一个 维的超长方体内,这个超长方体内的所有点也都在这原创 2020-12-29 11:22:52 · 295 阅读 · 0 评论 -
树上差分
文章目录树上差分1.算法分析1.1 边差分1.2 点差分2.典型例题树上差分1.算法分析树上差分是把差分思想运用到树上的技巧,常数小,好写,思想简单。**处理的问题是:**给定两个点l、r,将l~r路径上所有的边(点)都加k,然后求每条边(点)的权值。1.1 边差分**问题描述:**给定两个点l、r,将l~r路径上所有的边都加k,然后求每条边的权值。处理方法: f[i]f[i]f[i] 表示 i->fa[i]这条边的权值, f[l]+=k,f[r]+=k,f[lca(l,r)]−=2∗kf原创 2020-12-29 11:22:17 · 164 阅读 · 0 评论 -
后缀&前缀&中缀表达式
后缀&前缀&中缀表达式1.算法分析对于任意一个前缀、中缀、后缀表达式,都可以对应到一颗树,该树的叶子节点为数字,根节点为符号。如下图所示:而前缀、中缀、后缀表达式分别是对该树进行前序、中序、后序遍历得到的表达式。该树前缀表达式、中缀表达式、后缀表达式的答案一样,因此,如果希望得到前缀和后缀表达式的值,直接转化为求中缀表达式的值,等于树的: val(左子树) op val(右子树), 其中的op表示运算符号。定义整棵树的权值为该树对应的中缀表达式的值。而由于不同根节点允许赋的符号不原创 2020-12-29 11:21:16 · 210 阅读 · 0 评论 -
单调栈
文章目录单调栈1.算法分析2.模板3.典型例题3.1 针对每个数,寻找它和它左 / 右边第一个比它大 / 小的数的值,以及相距多少个数。3.2 对于每个点,找到以它为最大值/最小值的最长区间3.3 求最长的区间,区间内的元素比左边界大,比右边界小3.4 维护单调性单调栈1.算法分析单调栈顾名思义就是找一个单调的栈,可以处理如下问题:1.针对每个数,寻找它和它左 / 右边第一个比它大 / 小的数的值,以及相距多少个数。直接扫一遍单调栈即可2.多个区间中的最值 / 某个数为最值的最长区间正着扫一遍原创 2020-12-03 00:06:19 · 305 阅读 · 0 评论 -
LCA
文章目录LCA1. 算法分析1.1 求LCA的四种方法1.2 求lca的两种场景2. 板子2.1 树上倍增法2.2 tarjan算法2.3 dfs+ST2.4 树剖求lca3. 典型例题LCA1. 算法分析1.1 求LCA的四种方法1.树上倍增法: 倍增思想:f[i][j]f[i][j]f[i][j]表示i这个位置向上走2^j步后到达x,则有状态转移:f[y][j]=f[[y][j−1]][j−1]f[y][j] = f[[y][j-1]][j-1]f[y][j]=f[[y][j−1]][j原创 2020-09-19 00:19:13 · 139 阅读 · 0 评论 -
字典树
文章目录字典树1. 算法分析2. 模板2.1 字符串操作2.2 数字操作3. 典型例题字典树1. 算法分析trie树既可以对字符串进行操作,也可以对数字进行操作对字符串进行操作:把字符串的每一个字符看成一个结点对数字进行操作:每一个数字都可以看成是一个32位的二进制数,通过这种方式把每一个数字看成是一个长度为32的字符串,然后套用对字符串的操作2. 模板2.1 字符串操作“I x”向集合中插入一个字符串x;“Q x”询问一个字符串在集合中出现了多少次。#include <b原创 2020-09-18 01:20:55 · 120 阅读 · 0 评论 -
树状数组
文章目录树状数组1. 算法分析2. 板子2.1 一维树状数组:单点修改+区间查询2.2 一维树状数组:区间修改+单点查询2.3 一维树状数组:区间修改+区间查询2.4 二维树状数组:单点修改+区间查询2.5 二维树状数组:区间修改+单点查询2.6 二维树状数组:区间修改+区间查询3. 例题3.1 树状数组+逆序对3.2 树状数组+思维3.3 树状数组6大基本模板+推公式变形树状数组1. 算法分析树状数组作用单点修改区间查询区间修改(加上差分)核心思想 把前n个数划分为log(n)原创 2020-09-18 01:20:08 · 391 阅读 · 0 评论 -
并查集
文章目录并查集1.基础知识1.1 边带权并查集1.2 扩展域并查集1.3 并查集判断奇环2. 例题2.1 边带权并查集2.2 拓展域并查集2.3 并查集判环2.4 并查集区间合并2.5 路径压缩思想运用--从并查集思想出发并查集1.基础知识1.1 边带权并查集适用条件: 这样的方法适用于维护存在距离关系的情况,比如说统计相互间的大小关系,距离关系具体方法: 设置一个d数组,d[u]表示u到fa[u]的距离(或者表示u和fa[u]的属性是否相同)在两个地方需要维护:在做get操作时维护a到pa原创 2020-09-18 01:19:14 · 298 阅读 · 0 评论