文章分类 -  xjd的学习笔记

摘要:Miller-Rabin 素性测试 用于判断一个数是否是质数。 首先有费马小定理:若 \(\gcd(a,n)=1\) 且 \(n\) 是质数,有 \(a^{n-1}\equiv 1\pmod{n}\)。 假如费马小定理的逆命题成立,只需要随机 \(a\) 使得 \(\gcd(a,n)=1\),判断是 阅读全文
posted @ 2024-03-01 09:35 lgh_2009 阅读(26) 评论(0) 推荐(0)
摘要:概述 线段树(Segment Tree)是一种常用的维护区间信息的数据结构。线段树的结构是如下的分治结构: 线段树是完全二叉树,每一个节点表示一个区间,将每个长度不为 \(1\) 的区间均分成左右两个区间。对于节点 \(i\),左右儿子的编号分别为 \(2i,2i+1\)。 下面以 P3372 为例 阅读全文
posted @ 2024-03-01 09:35 lgh_2009 阅读(49) 评论(0) 推荐(0)
摘要:普通字典树 概述 字典树(Trie)是一种数据结构,一般用于处理字符串问题与异或问题。 字典树的结构是这样的: 其中每一个字符就是字典树的边,比如 aba 就是 \(0\to1\to2\to3\),ac 是 \(0\to1\to5\)。而其中的节点代表的是字符串的前缀。 字典树的主体可以用一个数组 阅读全文
posted @ 2024-03-01 09:34 lgh_2009 阅读(16) 评论(0) 推荐(0)
摘要:分块 template<typename T,int maxn>struct block_array{ int bn,bp[maxn],bl[maxn],br[maxn],len[maxn]; T v[maxn],tag[maxn]; void build(int n,T a[]){ bn=sqrt 阅读全文
posted @ 2024-03-01 09:34 lgh_2009 阅读(15) 评论(0) 推荐(0)
摘要:概述 莫队算法是一种离线算法,普通莫队可以 \(O(n\sqrt{n})\) 解决一些区间查询问题。这个问题需要满足区间 \([l,r]\) 的答案能快速求出区间 \([l-1,r],[l+1,r],[l,r+1],[l,r-1]\) 的答案。经过一些扩展可以完成修改、上树等操作。 普通莫队 例题 阅读全文
posted @ 2024-03-01 09:30 lgh_2009 阅读(13) 评论(0) 推荐(0)
摘要:定义 树状数组(Binary Indexed Tree,BIT)是一种数据结构,可以高效地维护一些单点修改的问题。搬一张 OI-wiki 的图: 设原数组为 \(a\),树状数组为 \(c\),有: \[\begin{aligned}&c_1=a_1\\&c_2=a_1+a_2\\&c_3=a_3\ 阅读全文
posted @ 2024-03-01 09:29 lgh_2009 阅读(7) 评论(0) 推荐(0)
摘要:概述 一种算法,常用于计算几何。大致思路是在其中一维维护一根扫描线,用一个数据结构维护被这条线所截的另一维信息。 例题 P5490 面积并是扫描线的一个比较典的应用。 假设有一根横向的扫描线从下往上扫,遇到一个矩形的上下边会停止,这根线会把矩形的并分成若干矩形,高为相邻两条边的高度差,宽为矩形的并覆 阅读全文
posted @ 2024-03-01 09:29 lgh_2009 阅读(183) 评论(0) 推荐(0)
摘要:定义 二叉查找树是一种树形数据结构,支持动态插入删除,查询排名和第 k 小,查询前驱后继等。二叉查找树的点权满足左儿子小于当前节点小于右儿子。上面的这些操作都可以在树上二分解决。 但是当树的深度很大,接近一条链时,操作复杂度会退化至 \(O(n)\),于是有了各种方法使树的深度保持期望 \(O(\l 阅读全文
posted @ 2024-03-01 09:29 lgh_2009 阅读(14) 评论(0) 推荐(0)
摘要:珂朵莉树可以做维护带有区间赋值的数据结构题。事实上,珂朵莉树不是树,甚至不是数据结构,本质是基于数据随机的颜色段均摊。 建树 珂朵莉树将数值相同的区间看做整体,用 set 维护。 节点的保存方式: template<typename T>struct node{ int l,r; mutable T 阅读全文
posted @ 2024-03-01 09:29 lgh_2009 阅读(16) 评论(0) 推荐(0)
摘要:建树 划分树(Dividing Tree)是一种可以解决静态区间 kth 的数据结构,与主席树相比更好理解,常数也更小。缺点是适用范围小,基本专门用来求解这个问题。下面以第 k 小为例。 划分树的结构如下: 方便起见,将原数组的长度补成 \(2\) 的整数幂。划分树的每个节点都是一个数组,根节点为原 阅读全文
posted @ 2024-03-01 09:29 lgh_2009 阅读(81) 评论(0) 推荐(0)
摘要:权值线段树 一个神奇的科技:通过简单重新编号可以使线段树只开两倍空间。对于一个区间 \([l,r]\),将节点编号设为 \((l+r)\operatorname{or}[l\ne r]\)。这样这个节点的标号范围为 \([2l,2r]\),实际 \(2mid+1\),左右儿子的标号范围为 \([2l 阅读全文
posted @ 2024-03-01 09:29 lgh_2009 阅读(7) 评论(0) 推荐(0)
摘要:根号分类讨论 HDU7226 给出一个排列 \(p\),一个完全图 \(i,j\) 的边权为 \(|i-j|\cdot|p_i-p_j|\),求最小生成树。 构造一条链,连接 \(i,i+1\),这样连的边小于 \(n\)。那么跑 Kruskal 求出来的最小生成树的边也小于 \(n\)。那么 \( 阅读全文
posted @ 2024-03-01 09:29 lgh_2009 阅读(27) 评论(0) 推荐(0)
摘要:分块是一种思想,指的是把数据划分为若干块,然后将块作为整体处理。此指数据结构中的块状数组。下文以维护区间加,区间查询为例。 初始化 一般来说,如果给出的数组长度为 \(n\),块数会取 \(\sqrt{n}\) 使块长与块数均衡。然后预处理块端点,每一个下标属于的块,块长与要维护的信息。末尾剩下的合 阅读全文
posted @ 2024-03-01 09:29 lgh_2009 阅读(12) 评论(0) 推荐(0)
摘要:概述 堆是一种数据结构。堆的形态是一棵树,满足每个节点的权值都大于等于或小于等于其父亲的权值,分别称为小根堆、大根堆。一般支持插入、删除最值、查询最值等操作。 下文以小根堆为例。 二叉堆 二叉堆是完全二叉树,同时满足堆的性质,不可并(复杂度过高)。 查询最值 返回堆顶即可。 T top(){ ret 阅读全文
posted @ 2024-03-01 09:29 lgh_2009 阅读(9) 评论(0) 推荐(0)
摘要:概述 堆是一种数据结构。一般支持插入、删除最值、查询最值等操作,有小根堆和大根堆,分别维护最小值、最大值。 下文以小根堆为例。 二叉堆 定义 二叉堆是完全二叉树,同时满足堆的性质,不可并(复杂度过高)。 查询最值 返回堆顶即可。 T top(){ return h[1]; } 上浮、下沉 对于单独的 阅读全文
posted @ 2024-03-01 09:29 lgh_2009 阅读(15) 评论(0) 推荐(0)
摘要:单调栈 概述 单调栈是一种特殊的,满足单调性的栈。单调栈插入元素时,不断弹出不满足单调性的元素。比如当前栈为 \(4,2,1\),插入 \(3\) 时要弹出 \(2,1\)。 单调栈维护的是当前的后缀最大值,因此当新元素入栈时间更晚,值更大,就要出栈。 单调递减栈代码: for(int i=1;i< 阅读全文
posted @ 2024-03-01 09:29 lgh_2009 阅读(10) 评论(0) 推荐(0)
摘要:概述 并查集是一种维护集合的数据结构,可以看作一个森林,其中每个森林都代表一个集合。 操作 初始化 初始时每个元素单独一个集合。对于树的根节点,其父亲可以设为结点本身或 \(0\) 号结点。 我倾向于设为 \(0\) 号结点,这样可以省下这一步。 查询 查询一个结点的祖先时只需要不断向上跳即可。 i 阅读全文
posted @ 2024-03-01 09:29 lgh_2009 阅读(13) 评论(0) 推荐(0)
摘要:概述 一种数据结构科技,可在 \(O(\log\log V)\) 的复杂度内支持插入、删除、查询前驱后继、查询元素是否存在、查询最值(相当于阉割了有关排名操作的平衡树),其中 \(V\) 是值域。 定义 首先把值域补到 \(2\) 的整数幂,设 \(V=2^u\)。 维护一个桶表示元素是否存在。运用 阅读全文
posted @ 2024-03-01 09:29 lgh_2009 阅读(136) 评论(0) 推荐(0)
摘要:ST 表(Sparse Table,稀疏表)是用于解决可重复贡献问题的数据结构。典型的应用是可以 \(O(\log n)-O(1)\) 解决 RMQ 问题(区间的最值查询,Range Maximum/Minimum Query)。 ST 表运用了倍增的思想。以静态区间最大值为例,设 \(f_{i,j 阅读全文
posted @ 2024-03-01 09:29 lgh_2009 阅读(23) 评论(0) 推荐(0)
摘要:树上 k 级祖先 int lg[n+5],dep[n+5],maxd[n+5],f[n+5][log2(n)+5],son[n+5],top[n+5]; vector<int>up[n+5],down[n+5]; void dfs1(int pos,vector<int>e[]){ maxd[pos 阅读全文
posted @ 2024-03-01 09:26 lgh_2009 阅读(7) 评论(0) 推荐(0)