合集-数据结构

摘要:不带权并查集 1、时间复杂度为 \(O(n)\) 。 struct DSU{ int n, cnt; vector<int> fa, siz; DSU() {} DSU(int n_) : fa(n_ + 1), siz(n_ + 1, 1) { n = n_; cnt = n; iota(fa.b 阅读全文
posted @ 2024-08-12 20:22 grape_king 阅读(53) 评论(1) 推荐(1)
摘要:莫队 1、时间复杂度为 \(O(n\sqrt n)\),用于离线处理一些操作的答案。 template<typename T> struct Md{ struct Q { int L; int R; int num; }; int n, m, k, len, l, r; T res; vector< 阅读全文
posted @ 2024-08-12 20:33 grape_king 阅读(58) 评论(2) 推荐(1)
摘要:注:树状数组中 \(lowbit\) 函数代表的是这个数所维护的区间长度。 树状数组(单点查询、区间修改) 1、时间复杂度为 add:\(O(log\ n)\),query:\(O(log\ n)\)。 2、模版:洛谷P3368。 template<typename T> struct Fenwic 阅读全文
posted @ 2024-08-13 22:14 grape_king 阅读(81) 评论(1) 推荐(1)
摘要:\(ST\) 表 1、定义与用途:一种用于快速查询区间 \(max,min,or,and,gcd\) 等等的算法,查询时间为 \(O(1)\),不过需要预处理,预处理时间为 \(nlogn\),且不支持区间修改和单点修改。 2、理解:\(ST\) 表主要是利用倍增数组来实现的,对于求解那些区间里面的 阅读全文
posted @ 2024-08-15 01:55 grape_king 阅读(63) 评论(0) 推荐(1)
摘要:线段树 1、定义:线段树是一种相对实用的算法,可以处理好多东西,有时候对于区间修改,可以通过懒标记法来维护一些更加复杂的问题。 (1)线段树模版: template<typename T> struct X_tree{ struct Segtree{ T siz, l, r; Segtree(T s 阅读全文
posted @ 2024-08-15 02:04 grape_king 阅读(46) 评论(0) 推荐(1)
摘要:字典树 1、用途:用于处理一些字符串匹配,或任意两数异或最大值,等等... 1、模版:洛谷P8306。 template<typename T> struct Z_tree{ int n, tot; vector<T> cnt; vector<array<int, 2>> tree; Z_tree( 阅读全文
posted @ 2024-08-15 02:10 grape_king 阅读(30) 评论(0) 推荐(1)
摘要:归并排序 1、二分归并排序可以算出一个数组中的逆序对数目,因为本身这个算法利用的就是分治算法,所以可以在 \(nlogn\) 的时间复杂度里面求出所有逆序对数目。 2、另外我还拓展了一些三分归并、四分归并...等等,目前没发现有啥用途,然后我又写了个代码,支持最多 \(31\) 分归并排序,通过这个 阅读全文
posted @ 2024-08-15 02:17 grape_king 阅读(28) 评论(0) 推荐(1)
摘要:笛卡尔树: 1、性质: 具有键值 \((k, w)\),且 \(k\) 为下标,\(w\) 满足小根堆性质。 具有小根堆性质,任意一个节点的子树节点数值都比其来得大,每个节点与其子树中的所有节点连起来是一段连续区间。 2、用途:可以用它来计算一个数组中子矩阵的最大值。 3、如图: template< 阅读全文
posted @ 2024-08-15 02:32 grape_king 阅读(35) 评论(0) 推荐(1)
摘要:平衡树 1、可以维护一个数在数组中的排名,排名为 \(x\) 的数,一个数的前驱和后驱。 2、模版:洛谷P8747 和 洛谷P6136。 3、查询和修改的时间复杂度:\(O(logn)\)。 template<typename T> struct Splay{ struct node{ int fa 阅读全文
posted @ 2024-08-15 02:38 grape_king 阅读(23) 评论(0) 推荐(1)
摘要:划分树 1、和主席树差不多的用法,只不过常数比主席树小。 2、可用于求解静态区间第 \(k\) 小问题。 3、时间复杂度:\(O(nlogn)\),空间复杂度:\(o(nlogn)\),所以划分树是一个非常优的算法。 4、模版:洛谷P3834。 template<typename T> struct 阅读全文
posted @ 2024-08-15 02:40 grape_king 阅读(40) 评论(0) 推荐(1)
摘要:动态开点线段树 1、与普通线段树相比,优点在于对于 \(1e8-1e18\) 以内的权值维护不需要进行离散化,可直接进行动态开点维护,更加方便,但是这样会比原来线段树维护的空间复杂度来得高,空间复杂度更差一些。 2、如图说明动态开点过程: 可以发现我们不需要用到区间 \([6,6]\) 的两个子节点 阅读全文
posted @ 2024-08-15 02:41 grape_king 阅读(44) 评论(0) 推荐(1)
摘要:李超线段树 性质:李超线段树一般支持具有单调性的函数,如一次函数。 1、李超求该位置包含的所有函数的 \(min\): template<typename T> struct LC_tree{ T eps = 1e-15; struct line{ T k, b; line(T k = 0.0, T 阅读全文
posted @ 2024-08-15 02:42 grape_king 阅读(22) 评论(0) 推荐(1)
摘要:权值线段树 1、一种可以处理整个数组的第 \(k\) 大数或第 \(k\) 小数的算法,依名可知,该线段树是由数值来建线段树的,如果对于权值为 \(1e9\) 这样的数据,我们也可以通过离散化的方式进行值域压缩,从而缩小到 \(2e5\) 的样子,和普通线段树一样,可以通过懒标记来维护一段区间的修改 阅读全文
posted @ 2024-08-15 02:42 grape_king 阅读(35) 评论(0) 推荐(1)
摘要:扫描线 阅读全文
posted @ 2024-08-27 09:09 grape_king 阅读(9) 评论(0) 推荐(1)
摘要:平衡树简洁版 1、用法: \(insert(x)\):向树中插入一个元素 \(x\),返回 \(std::pair<point\_iterator, bool>\)。 \(erase(x)\):从树中删除一个元素 \(/\) 迭代器 \(x\),返回一个 \(bool\) 表明是否删除成功。 \(o 阅读全文
posted @ 2024-09-08 00:44 grape_king 阅读(30) 评论(0) 推荐(0)
摘要:高精度 #include <bits/stdc++.h> #define gc() getchar() using namespace std; using i64 = long long; using ui64 = unsigned long long; using i128 = __int128 阅读全文
posted @ 2024-09-11 21:33 grape_king 阅读(29) 评论(0) 推荐(0)
摘要:\(Treap\) 树性质 具有 \(BST\) 树的二叉搜索性质,又具有堆的性质,从而保证树不退化成一颗链,保证操作都是 \(log\) 级别的。 std::mt19937_64 rng(std::chrono::steady_clock::now().time_since_epoch().cou 阅读全文
posted @ 2024-12-22 14:54 grape_king 阅读(28) 评论(0) 推荐(0)
摘要:线段树合并 1、例题:P3324 struct node{ int siz, id, l, r; node(int siz = 0, int id = 0, int l = 0, int r = 0) : siz(siz), id(id), l(l), r(r) {} } tree[N + 1]; 阅读全文
posted @ 2024-12-26 02:18 grape_king 阅读(27) 评论(0) 推荐(0)