随笔分类 - 数据结构
摘要:Kruskal重构树: 简单来讲,就是在Kruskal算法进行的过程中,我们把最小生成树的边权改为点权,加虚点连边,原树的节点个数变成2n-1个 Kruskal重构树的性质 1.根据我们构造的过程,这是一个二叉堆 2.原树两点之间的边权最大值是重构树上两点Lca的权值 3.重构树中代表原树中的点的节
阅读全文
摘要:分为四种操作: 单点向单点连边 单点向区间连边 区间向单点连边 区间向区间连边 1可以和其他几个合并 接下来讲实现。 我们考虑用两棵线段树来搞,建两棵线段树,一棵处理入边,一棵处理出边,方便起见,我们下文称其为入树和出树。 开始我们让父亲和儿子连边,然后我们再让入树和出树的叶子节点之间连上边权为0的
阅读全文
摘要:最近做题发现自己并不知道什么时候该用树套树,就来总结一下 一、静态整体kth 排序输出 sort(a+1,a+n+1); printf("%d\n",a[k]); 时间复杂度O(nlogn) 空间复杂度O(n) 二、动态整体kth 权值线段树+二分 查询时先查询左子树和sum,比较k和sum的大小:
阅读全文
摘要:一、线段树合并的思想 线段树合并,顾名思义,就是建立一棵新的线段树保存原有的两颗线段树的信息。 二、线段树合并的流程 假设我们合并到了两棵树的pos位置 如果a有pos位置,b没有,那么新的线段树pos位置赋成a,返回 如果b有pos位置,a没有,赋成b,返回 如果此时已经合并到两棵线段树的叶子节点
阅读全文
摘要:解决问题: 猫树是解决无修改区间或树上询问的高效算法. 对于常规问题,比如区间最值,区间最大子段和。我们常常能用线段树等数据结构达到,构造 O(n),询问 O(logn)的时间复杂度。 对于这些做法,只有一点不好,询问复杂度 不够优秀,且对于一些特定问题,线段树的push_up合并也不好写。 但对于
阅读全文
摘要:定义: 笛卡尔树是一种二叉树,每一个节点由一个键值二元组$(k,w)$构成,要求$k$满足二叉搜索树的性质,而$w$满足堆的性质 构建: 我们考虑按照键值$k$排序,然后一个一个插入到当前的笛卡尔树中(这样就保证了他一定满足二叉搜索树的性质),且每次我们插入的元素一定在这个树的右链(右链:即从根结点
阅读全文
摘要:经过了一系列的前置知识,终于学会了树链剖分!! 重链剖分的思想: 重链剖分可以将树上的任意一条路径划分成不超过$O(logn)$条连续的链,每条链上的点深度互不相同(即是自底向上的一条链,链上所有点的$LCA$$为链的一个端点)。 重链剖分还能保证划分出的每条链上的节点$DFS$序连续,因此可以方便
阅读全文
摘要:定义: dfs序:每个节点在dfs深度优先遍历中的进出栈的时间序列。 性质: dfs序可以把一棵树区间化,即可以求出每个节点的管辖区间。 对于一棵树的dfs序而言,同一棵子树所对应的一定是dfs序中连续的一段。 code: void dfs(int x,int fa){ in[x] = ++cnt;
阅读全文
摘要:树上差分 树上差分,就是利用差分的性质,对路径上的重要节点进行修改(而不是暴力全改),作为其差分数组的值,最后在求值时,利用$dfs$遍历求出差分数组的前缀和,就可以达到降低复杂度的目的,可以应用于求对树上的一段路径进行操作,并询问某个点或某条边被经过的次数 点差分 设将两点$u$,$v$之间路径上
阅读全文
摘要:#### st表算法流程: 预处理:$ST$表在预处理阶段需要计算一个数组$f$,$f_{i,j}$表示区间$i\rightarrow i+2j-1$的最小值,也就是从$i$开始连续$2j$个数的最小值。它可以通过倍增得到:(将$2j$从中间平均分成两部分,每一部分都刚好是$2$,而这就是一个子问题
阅读全文

浙公网安备 33010602011771号