随笔分类 - 数据结构
摘要:根号算法专题 分块基础 根号平衡 对于两个不同方面的复杂度,直接做的话一个很小,一个很大,我们用根号使得两者复杂度同阶级以降低总复杂度。这个叫根号平衡。 一个典型的应用是根号分治。打个比方我们想 以下复杂度统计序列从某一位下标等差的一种前缀和,我们全部预处理空间复杂度是 \(O(n
阅读全文
摘要:解决多线段单点最值问题。 模板题 浅略的说一下。 每个区间存储位于当前区间中的值最大的线段。每次插入新线段,如果当前区间没有存储线段,就直接插在这里,否则分类讨论一下,如果某一个子区间的最优线段必定是当前线段,这个子区间就不用处理了。而对于另一个有不确定因素的,我们把当前的不优线段下传即可。具体实现
阅读全文
摘要:没什么好讲的,直接码就完了。 #include<bits/stdc++.h> #define ll long long #define db double #define filein(a) freopen(#a".in","r",stdin) #define fileot(a) freopen(#
阅读全文
摘要:缩点 之前提过,不再多说 link 去无用边优化建图 最为简单的就是去重边,删自环。 稍微升级一点就是最小生成树。 一个例题 CF1095F Make It Connected solution 前后缀优化建图 解决对于一个点向一段前缀或者后缀连边的问题。 具体的做法是将整个区间建立一条长为 \(n
阅读全文
摘要:笛卡尔树 定义 同时满足堆和二叉搜索树的性质。即对于每个节点有两个键值 。其中 满足堆的性质,而 满足二叉搜索树的性质。 构造 我们把点按照 排序,那么我们新加入的点直接往右链放即可。因此我们用栈维护这个过程。 具体来说栈维护右链,且内部元素的 \
阅读全文
摘要:一维树状数组 树状数组基本原理 我们借 OI-wiki 上的图用用: 原理是对于每个节点,存储一段连续的长度为 的次幂的区间。 而具体来说,对于一个数 ,其管理 长度的区间,而这具体是那个区间也可以写出: 。
阅读全文
摘要:实链剖分 就是可以随意乱剖,想干嘛干嘛的剖分。我们面对动态树问题(树形会变化的问题),用实链剖分可以灵活的维护。然后因为实链剖分比较灵活,我们类比重链剖分,也考虑使用一种数据结构维护这个树上信息。论灵活度,相比线段树来说,splay 是更好的选择。 LCT 也叫 link-cut tree ,用于维
阅读全文
摘要:最近才发现的一个套路,以前以为二进制分组只能搞背包,结果发现还有一些更为优秀的操作。 我们对于一个不支持动态操作的数据结构,拆分为 个,然后每次加入元素加入到一个新的组中,如果最新的两个数据结构元素个数相等,就合并两个元素。然后暴力重构这个合并得到的数据结构。 然后查询的时候就查询每一个
阅读全文
摘要:用于维护异或的数据结构。(又是模拟赛保龄过来补) 废话多不多说了,直接上正题。 先说什么是线性基吧。() 就是说对于一个集合,如何它对于异或在线性基集合中封闭。那么我们认为之歌构造出的集合是线性基。对于异或封闭是什么意思?就是说它内的元素异或来异或去就只会得出原集合的东西。 怎么构造? 考虑对于每一
阅读全文
摘要:同trie,只是维护的字符只有0和1 可以通过每次如果可以选择不同字符则选择不同字符的贪心思想维护最大异或和。多用于解决异或问题。 为什么上面那样操作可以维护最大异或和?因为我们按照从高位往底的顺序,如果当前答案这一位异或得1,其他答案的更高位都不超过当前答案的更高位,且其他答案这一位异或得0,那么
阅读全文
摘要:终于来补线段树合并了,之前本来打算写的,结果懒了。 前置知识 动态开点线段树 算法操作 就是对于每个点维护一颗不全的线段树,对于每个节点记录其对应线段树的根节点。对于需要其子树贡献的节点,自下而上合并线段树,再查询。 很显然,和 Dsu on tree 是同类的算法. 具体实现 我们只需要知道线段树
阅读全文
摘要:就是对于一颗动态开点的线段树(而且一般为权值线段树),我们把它拆开拆成两份(一般来说:为了方便,按sz分裂) 可以用来干嘛呢,小编也很疑惑,或许是可以用于把这边线段树的区间转移到另一边? 那么废话不多说直接开始。 实现原理 有点类似于求排名为 的数的过程,考虑其左子树的值,如果这个值大于
阅读全文
摘要:layout: post title: 权值线段树 subtitle: 线段树的特殊运用,可以称之为小小平衡树 categories: 数据结构 tags: [线段树] 顾名思义,维护权值的线段树。在一定情况下可以代替平衡树使用。 原理是用线段树维护桶,节点维护子树中数的个数。所以空间开销与数据的值
阅读全文
摘要:多用于 权值线段树 用多少点开多少点,空间复杂度降至 P3369 #include<bits/stdc++.h> using namespace std; #define file(a) freopen(#a".in","r",stdin),freopen(#a".ou
阅读全文
摘要:发现以前学的时候摸鱼,都没有搞明白原理,现在来捡了。 左偏树是一种可并堆,满足以下性质: 堆的性质:根的值比儿子大 左偏性质:左子树的距离不小于右子树的距离 距离是什么意思?就是指当前节点到最近的外节点的距离。 外节点是什么?就是不完整的节点,也就是儿子个数不满的节点。 堆的性质决定了左偏树的作用,
阅读全文
摘要:支持修改区间加、区间乘、查询区间和的线段树结构体封装版 可以类比的写出其他操作 struct node { int l,r,mid; long long d,lazyadd,lazymul; }; struct tree { node t[N*4]; void build(int i,int l,i
阅读全文
摘要:简单论一下区间修改,单点查询的树状数组。 我们是考虑维护一个对于原数组的差分数组,然后取答案时用原数组加上查分数组得到。 资料 二维树状数组 参考资料:资料 单点修改 void modify(int i,int j,int k) { a[i][j]+=k; for(int x=i;x<=n;x+=(
阅读全文
摘要:Splay,即伸展树,较为受众的平衡树,依靠双旋的速度称霸(虽然替罪羊更快,但是splay在之后有光明的未来(可以发展为LCT),总之是比treap快) 平衡树调试两大题:P3369+P6136 注: 本文采用非递归 信息维护 我们对于splay树上的一个节点维护以下信息: 子树大小
阅读全文
摘要:#include<bits/stdc++.h> using namespace std; int n,m,tot; struct treap { int ch[3],pri,size,v; }t[100010]; void update(int x) { t[x].size=1+t[t[x].ch[
阅读全文
摘要:因为之前学东西学得太菜所以重学了。 不说多了直接正题。 思想解析 本质上就是普通的BST,只是多了一个重建不平衡子树的重构操作。 很显然每个平衡树都有一个维护平衡的操作,那么替罪羊树的平衡操作就是重构。 最开始的时候教练说替罪羊十分暴力,一不平衡整棵树拍扁重构。但是其实并不是整棵树重构,而且操作并不
阅读全文