ACM数据结构
文章平均质量分 87
罗博士
这个作者很懒,什么都没留下…
展开
-
树上启发式合并(DSU-on-Tree)
树上启发式合并,用来解决子树查询问题,是一种离线的、“暴力的”算法。从某种角度而言,与莫队算法有些类似,即:按照我们指定的顺序对数据做一个遍历,在遍历过程中记录询问的答案。CF上有一个专门的blog,讲了很多,本文只涉及到有关轻重链剖分的部分。oi-wiki上有一个更短的文章。递归统计子节点的数据先统计轻儿子(统计完的数据即刻清空)最后统计重儿子(统计完的数据保留下来)统计自己的数据(就是再统计一遍轻儿子的数据,加上本节点的数据)原创 2024-06-28 16:13:59 · 702 阅读 · 0 评论 -
支配树与Lengauer-Tarjan算法
支配树的Lengauer-Tarjan算法原创 2023-03-29 10:45:51 · 564 阅读 · 0 评论 -
树状数组与前缀和差分数组以及二维树状数组
树状数组与前缀和差分数组以及二维树状数组树状数组基本思想树状数组基本思想树状数组有称作Binary Index Tree,顾名思义,就是一种以二进制为索引的数据结构。另源数组记作AAA。考虑需要求取Σ\SigmaΣ...原创 2020-03-13 11:19:41 · 881 阅读 · 0 评论 -
POJ2528线段树区间合并加离散化
POJ2528Mayor’s posters就只支持一种操作,一次性的给一段区间涂上颜色,且每次颜色均不一样。问最后一共可以看到多少种颜色。关于线段树的更详细实现请参考线段树解决区间问题包括延迟操作以及离散化/* 在数轴上,一次给一个线段涂上颜色 后面的颜色会覆盖前面的颜色 问最后能看到多少个颜色 显然是成段更新,线段树 区间范围是1千万,需要离散化...原创 2020-03-10 20:22:28 · 247 阅读 · 0 评论 -
POJ3667线段树区间合并
POJ3667Hotel要求支持两种操作:成段分配与成段回收。/* 1 a:找一段空间有连续a个空,分配出去 2 a b: 从a开始的b个位置回收*/#include <stdio.h>int const SIZE = 50010;//ST[t]表示t节点中最长的可用空间int ST[SIZE<<2];//Start[t]表示最长可用空间的...原创 2020-03-10 19:51:49 · 157 阅读 · 0 评论 -
hdu4578线段树多种延迟标记
hdu4578Transformation,要求支持3种修改操作与3种查询操作。/* 数组A[1...N],一共有4种操作 1 x y c:A[x...y]增加c 2 x y c:A[x...y]乘以c 3 x y c:A[x...y]全都变成c 4 x y p:求SIGMA(Ai^p) x<=i<=y,1<=p<=3 建...原创 2020-03-10 19:48:00 · 392 阅读 · 0 评论 -
线段树解决区间问题包括延迟操作以及离散化
线段树解决区间问题包括延迟操作以及离散化线段树简介与分治策略线段树简介分治策略线段树不能解决的问题线段树的基本操作线段树的简单示例线段树的基础代码实现辅助操作建树查询修改延迟操作延迟操作思想延迟操作代码实现线段树简介与分治策略线段树简介线段树是一棵二叉树,用来解决区间问题。线段树的每个节点均保存有源数组中某个区间的特征值(最值、区间和、……)。本质上说,线段树是区间问题分治策略的实现模板。...原创 2020-03-08 13:45:36 · 472 阅读 · 0 评论 -
伸展树应用初步——解决区间问题
伸展树的基本操作就是伸展,也就是将指定节点旋转至树根(同时不改变排序二叉树的性质)。在这个操作的基础上,配合节点中保存额外的数据域,伸展树可以完成多种任务,包括各种区间问题。 伸展树的节点除了保存必要的指针信息和键值对之外,经常使用的额外的数据域包括size域、sum域、极值域等等。size域用于记录该节点所代表的子树的节点总数,可以用于解决区间kth数问题;sum域用于记录该节点所代表原创 2014-05-09 21:44:42 · 2629 阅读 · 0 评论 -
树的DFS序
树是一种非线性结构,一般而言,我们总是想办法将其转化为线性结构,将树上操作包括子树操作、路径操作等转化为数组上的区间操作,从而在一个较为理想的复杂度内加以解决。将树“拍平”的方法有很多,例如欧拉序、HLD等。实际上欧拉序也是在DFS过程中得到的。不过通常而言,我们所说的DFS序是指:每个节点进出栈的时间序列。 考虑上图中树的DFS序,应为 其中,每个节点均会出现2次,第一次是进入DFS的时刻,第原创 2017-01-04 21:58:55 · 4159 阅读 · 1 评论 -
树上莫队算法
江湖传闻,莫队算法能够解决一切区间查询问题。这样说来,莫队算法也能够解决一切树上路径查询问题,将树上操作转化为DFS序列上的区间操作即可。当然考虑到,树上路径在DFS序列中的性质,还要会求LCALCA。考虑上图中的树,其DFS序为其任意点对aa、bb之间的路径,具有如下性质,令lcalca为aa、bb的最近公共祖先:若lcalca是aa、bb之一,则aa、bb之间的InIn时刻的区间或者OutOu原创 2017-01-05 16:25:58 · 5636 阅读 · 10 评论 -
莫队算法
莫队算法是一个非常好的算法。最简单的莫队算法用于解决一类序列上无修改只查询的区间问题。经过不同改进后,还可以解决树上路径查询问题,带修改的区间查询问题……总之,莫队算法可以解决一切区间问题。当然,莫队算法还有一个显著特征——莫队算法是一个离线算法。考虑SPOJ3267,给定一个数组,在数组上进行qq次询问。每次问区间[i,j][i,j]中不同元素的总数有多少。显然暴力法非常容易写,但复杂度绝对不理想原创 2017-01-03 17:03:07 · 2823 阅读 · 1 评论 -
树链剖分HLD解决子树问题
树链剖分HLD可以将非线性的树结构转换为由若干条树链构成的数组,并对数组采用线段树等手段,在一个令人比较满意的时间复杂度内完成树上路径操作,包括路径查询和路径修改。实际上,树链剖分也可以完成子树相关的操作,而且只需稍许改进即可。 考虑这样一个树以及剖分出的树链数组,可以非常明显的看到,任意节点及其子树在数组中均是连续的,而且一定以该节点开头。例如CC子树为CHLNGIMCHLNGIM,BB子树为B原创 2017-01-02 16:21:18 · 1105 阅读 · 0 评论 -
树链剖分之HLD
树链剖分的原理对于数组这样的线性结构,要在其上实现区间查询(和与最值)、区间修改甚至是区间增删都是有办法的。例如Sparse Table算法、树状数组、线段树以及伸展树等。而树是一种非线性结构,为了高效的实现在树上的路径查询、路径修改操作,基本做法是将树按照某种方式剖成若干条链,再将这些链按照顺序组成数组,最后在数组上采用线段树等手段实现操作。 考虑如下一棵树: 可以把它剖成6条链,分别是A原创 2017-01-02 13:51:09 · 2441 阅读 · 0 评论 -
伸展树解决区间问题
伸展树解决区间问题的原理考虑一个序列,从1开始编号,记作A[1...N]A[1...N],在其上实施一些区间操作。例如,将[s,e][s, e]中的数都增加一个deltadelta,查询[s,e][s, e]的所有数的和或者极值,甚至将[s,e][s, e]区间从原序列中删除(之后的数依次前移),将新的数插入到原序列中指定的位置(该位置及其以后的数依次后移)。这个时候,以原序列中的下标为键原创 2016-06-04 12:18:14 · 1466 阅读 · 0 评论 -
伸展树的旋转和伸展操作
伸展树(Splay Tree)是一种排序二叉树,其核心操作是伸展。所谓伸展就是把指定节点旋转至树根(同时保持排序二叉树性质)的过程。而伸展操作的基础就是旋转。 旋转是所有排序二叉树的基本操作,各种平衡二叉树想要维持其平衡性质都离不开旋转。旋转分为左旋和右旋。但实际上,如果指定节点为左儿子,那么它只能右旋;如果指定节点为右儿子,那么它只能左旋。所以如何旋转可以看作是节点本身的一种性质,而非原创 2014-05-08 09:37:39 · 3895 阅读 · 0 评论 -
伸展树的节点的size域的应用
伸展树不是平衡二叉树,但是它的操作均摊是O(logNlogN)的,只需要将增、删、查、改的节点都加以伸展即可。因此可以用来解决相关问题。在伸展树的节点上附加一个size域,用来保存以该节点为根的子树的节点总数。这个size域可以用来解决很多问题。例如可以解决区间问题,例如SBT就是用这个size域来计算平衡条件。size域能够解决的最简单、最直接的问题就是kth问题——求第k小的数。在伸展树上加上s原创 2016-05-30 23:55:14 · 664 阅读 · 1 评论 -
静态RMQ的Sparse Table算法
本文的核心内容包括源代码原创 2014-04-22 08:40:00 · 970 阅读 · 0 评论