随笔分类 -  学习笔记 / 数据结构

1
摘要:无旋treap的核心操作时分裂与合并,分裂分为按值分裂和按排名分裂,按值分裂用于维护权值平衡树,按排名分裂用于维护序列。 按值分裂平衡树。 struct Treap{ struct tree{ int l,r,v,p/*随机值*/,w; }t[N]; int tot,root,INF=0x7ffff 阅读全文
posted @ 2022-11-18 20:54 半步蒟蒻 阅读(89) 评论(0) 推荐(2) 编辑
摘要:树状数组每个点管理的区间是[ilowbit(i)+1,i],一般用单点修改区间查询问题。 单点修改区间查询树状数组。 struct BinaryIndexedTree{ int t[N]; inline int lowbit(int x){ return x&-x; } inline void 阅读全文
posted @ 2022-11-14 18:06 半步蒟蒻 阅读(18) 评论(0) 推荐(0) 编辑
摘要:可持久化线段树,又称主席树,通常用于维护序列和值域。 对于单点修改的可持久化线段树,它主要的思想就是每次新建一个版本,复制一条链。 单点修改和查询历史版本。不能再用lcrc记录根节点的左右子树,需要用变量来记录,每次修改最多复制O(logN)的链。 struct PersistentS 阅读全文
posted @ 2022-11-14 18:06 半步蒟蒻 阅读(54) 评论(0) 推荐(0) 编辑
摘要:可持久化栈,支持当前时刻入栈、回溯到某一时刻、某时刻出栈。 struct PersistentStack{ int stk[N],tp,pre[N],root[N]; inline void push(int p,int x){/*当前p时刻入栈*/ stk[++tp]=x; root[p]=tp; 阅读全文
posted @ 2022-11-14 18:05 半步蒟蒻 阅读(77) 评论(0) 推荐(0) 编辑
摘要:treap是一种弱平衡的二叉搜索树,同时符合二叉搜索树和堆的性质,堆一般用随机值的小根堆。 旋转treap在每次有修改操作时,通过比较节点的优先值来决定是否旋转,通过旋转来维持树的平衡。 不维护自身副本数,左子树小于等于根节点,右子树严格大于根节点。 struct Treap{ struct tre 阅读全文
posted @ 2022-11-14 18:04 半步蒟蒻 阅读(65) 评论(0) 推荐(0) 编辑
摘要:字典树trie,用于检索字符串是否出现过,也可以检索前缀,对于字符串的trie,每个点拥有26个儿子,具有相同前缀的字符串共用前缀节点,整棵树的根节点为空,默认只有小写字母。 一般而言,roottot是可以初始化为0的,但是特殊情况下需要初始化为1,故多数时候初始化为$ 阅读全文
posted @ 2022-11-14 18:04 半步蒟蒻 阅读(64) 评论(0) 推荐(0) 编辑
摘要:配对堆是可并堆的一种,支持插入、查询最小值、删除最小值、修改元素,但是无法可持久化。 配对堆是满足堆性质的带权多叉树,使用儿子-兄弟表示法存储。 在删除最小值时,为了保证总的均摊复杂度,需要把儿子们两两配对,再用merge把配成一对的两个儿子合并到一起,再将新产生的堆从右往左挨个合并。 这里的父指针 阅读全文
posted @ 2022-11-14 18:03 半步蒟蒻 阅读(187) 评论(0) 推荐(0) 编辑
摘要:斜堆是可并堆的一种,与左偏树类似,只不过没有零距离的概念,在进行合并时不需要比较左右儿子的dis,直接进行合并即可。 这里的父指针并不是真的维护父亲,而是对于并查集的找根操作,因为只要求删除最小值,所以只需要知道一个集合的根节点即可,于是可以路径压缩。 struct SkewHeap{ struct 阅读全文
posted @ 2022-11-14 18:03 半步蒟蒻 阅读(39) 评论(0) 推荐(0) 编辑
摘要:ST表,Sparse Table,是解决区间最值问题,及RMQ问题的工具,利用倍增思想,O(N*log2(N))预处理,O(1)查询。 设f[i][j]表示从i开始的2^j个数的最值,初始化f[i][0]=a[i],对于处理f数组,首先枚举区间长度j,第二层枚举左端点i,当i+(1<<j)-1>n时 阅读全文
posted @ 2022-11-14 18:02 半步蒟蒻 阅读(70) 评论(0) 推荐(0) 编辑
摘要:笛卡尔树是一种二叉搜索树,同时也满足大根堆或小根堆的性质,Treap也是一种笛卡尔树。 每个节点记录信息(x,y),对于x是二叉搜索树,对于y是小根堆,在x递增的情况下,可以线性时间内构造一颗笛卡尔树。 两个点的lca的权值就是它们在原序列中的RMQ. 笛卡尔树的先序遍历即是原序列,对于下标为数组下 阅读全文
posted @ 2022-11-14 17:59 半步蒟蒻 阅读(319) 评论(1) 推荐(0) 编辑
摘要:基于分块思想,常用的有数列分块,之间分块,以及值域分块 把一个数组分为几个块,块内信息整体保存,两边散块进行暴力 首先进行分块 int len=sqrt(n);/*选择块长,也可以手动调节*/ for(int i=1;i<=n;i++)bl[i]=(i-1)/len+1;/*每个点所属块的编号*/ 阅读全文
posted @ 2022-11-14 17:53 半步蒟蒻 阅读(35) 评论(0) 推荐(0) 编辑
摘要:分块优化vector实现平衡树,当一个vector的大小超过定长的一半时将其分裂一半,删除时进行合并操作。 但是,对于块长需要一定的人品,在数据范围1e6时,取sz=1000和1600可以,但是800或2000都不行。 template<const int sz=1600,const int inf 阅读全文
posted @ 2022-11-14 17:53 半步蒟蒻 阅读(37) 评论(0) 推荐(0) 编辑
摘要:SizeBalancedTree是通过维护节点大小来保持平衡的二叉搜索树,平衡的条件是任意节点的size不小于其兄弟节点的所有子节点的size。 重点在于时间复杂度均摊O(1)的maintain函数。 对于每个节点,若左子树的左子树的节点数大于右子树的节点,需要右旋根来平衡。 若左子树的右子树的节点 阅读全文
posted @ 2022-11-14 17:52 半步蒟蒻 阅读(64) 评论(0) 推荐(0) 编辑
摘要:左偏树是可并堆的一种,支持在O(log2(N))的时间复杂度内进行合并的堆式数据结构。 定义外结点:lc或rc为空结点。 定义零距离:x的距离dis[x]为x子树内与x最近的外结点到x的距离,空结点dis=-1. 左偏树具有堆性质,若为小根堆,对于所有x,v[x]<=v[lc],v[x]<=v[rc 阅读全文
posted @ 2022-11-14 17:49 半步蒟蒻 阅读(28) 评论(0) 推荐(0) 编辑
摘要:回文树(EER Tree,Palindromic Tree)亦称回文自动机,用于存储一个串中的所有回文子串。 由于回文串可能有奇有偶,于是分为两棵树进行构建,偶跟编号为0,长度为0,fail指向奇根,奇根编号为1,长度为-1,fail指向自身。 fail指向的是该节点的最长回文后缀,新加入字符时跳f 阅读全文
posted @ 2022-11-14 17:48 半步蒟蒻 阅读(63) 评论(0) 推荐(0) 编辑
摘要:AC自动机以trie为基础,首先将若干模式串插入trie树中,之后构建fail指针和AC自动机,即由trie树变为trie图。 fail指针的定义是,对于当前点x,从根到x形成的字符串为s,x的fail指针指向y,其中满足根到y形成的字符串t是s的最长后缀。 BFS构建AC自动机,第二层的所有节点的 阅读全文
posted @ 2022-11-14 17:48 半步蒟蒻 阅读(52) 评论(0) 推荐(0) 编辑
摘要:线段树扫描线,矩形面积并,面积的求法模拟扫描线从下向上扫过图形,并快速计算当前扫描线被截得的长度。将横边赋上不同的权值,下边为1,上边为-1。所有横边按照y坐标生序排序,每次先碰到下边,再碰到上边。 矩形周长并,纵边总长度=sum(2被截的线段条数扫过的高度),横边总长度=sum(|上次截得的总长- 阅读全文
posted @ 2022-11-14 17:41 半步蒟蒻 阅读(42) 评论(0) 推荐(0) 编辑
摘要:树链剖分是将一棵树分成几条链,把树形变为线性以减少处理难度。 对于轻重链剖分,每个非叶子节点的儿子中儿子数量最多的那个儿子为重儿子,其余所有儿子为轻儿子。 重边指连接两个重儿子的边,其余的边为轻边。 重链指相邻重边连起来的一条重儿子的链。 每一条重链以轻儿子为起点。 dfs序中子树的dfs序是连续的 阅读全文
posted @ 2022-11-14 17:41 半步蒟蒻 阅读(97) 评论(0) 推荐(0) 编辑
摘要:动态开点线段树,只有需要用到一个点才新建该点,否则不进行构建,可以节省空间复杂度。 class SegmentTree{ struct tree{ int l,r,sz; }t[N<<2]; int tot,s[N<<2],root[N],rtc=1,L=-1e7,R=1e7; #define l( 阅读全文
posted @ 2022-11-14 17:40 半步蒟蒻 阅读(156) 评论(0) 推荐(0) 编辑
摘要:并查集本质上是维护一个森林,初始时森林里每个点是一个集合,之后将集合合并,查找一个点所在集合的代表元素,将两个集合的代表元素进行合并。使用时不要忘记初始化! 在一般情况下,可以使用路径压缩与按秩合并或启发式合并。 struct DSU{ int f[N<<1],sz[N<<1],rk[N]; inl 阅读全文
posted @ 2022-11-14 16:47 半步蒟蒻 阅读(34) 评论(2) 推荐(0) 编辑

1
点击右上角即可分享
微信分享提示