![](https://img-blog.csdnimg.cn/20190918135101160.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
高级数据结构
文章平均质量分 53
并查集,树状数组,线段树,替罪羊树
不给糖吃就胡闹
这个作者很懒,什么都没留下…
展开
-
P1712 [NOI2016] 区间(线段树 + 贪心 + 双指针)
换句话说,就是使得存在一个 x ,使得对于每一个被选中的区间 [li,ri],都有 li≤x≤ri。第 2 到第(n+1) 行,每行两个整数表示一个区间,第 (i+1) 行的整数 li,ri 分别代表第 i 个区间的左右端点。区间[li,ri] 的长度定义为 (ri−li) ,即等于它的右端点的值减去左端点的值。在数轴上有 n 个闭区间从 1 至 n 编号,第 i 个闭区间为 [li,ri]。对于一个合法的选取方案,它的花费为被选中的最长区间长度减去被选中的最短区间长度。原创 2024-04-12 14:40:43 · 327 阅读 · 0 评论 -
P3369 【模板】普通平衡树(splay 算法)
比如:x右旋,x的右儿子为y,这时原本的x的右儿子就要当y的左儿子。第一行为 n,表示操作的个数,下面 n 行每行有两个数 opt 和 x,opt 表示操作的序号(1≤opt≤6)我们找到它的前驱和后继,再进行把删除的点移到其后继的左儿子上,再进行删除操作。我们自己构造平衡二叉树,左儿子节点小于父节点,右儿子的全部节点大于父节点。而且x为y的左儿子,x的任意一个儿子一定小于其x的父节点。当直线型时,先旋转它的父节点,在旋转它自己本身。在遍历它的左儿子的右儿子。右旋时:x的右儿子当作y的左儿子。原创 2024-03-28 10:46:50 · 746 阅读 · 0 评论 -
P3901 数列找不同 (两种做法 树状数组 和 dp记录其左端点的 最大 值 )
现有数列 1,2,…,A1,A2,…,AN,Q 个询问(Li,Ri),询问 ALi,ALi+1,…,ARi 是否互不相同。对于 100% 的数据,1≤N,Q≤105,1≤Ai≤N,1≤Li≤Ri≤N。树状数组是求区间的和。判断区间的和 与 区间的大小一样,则没有重复的数组。第二行,N 个整数A1,A2,…接下来 Q 行,每行两个整数 Li,Ri。对于 50% 的数据,N,Q≤103。时间复杂度为:O(n*logn)第一行,两个整数N,Q。时间复杂度为:O(n)原创 2024-03-26 15:59:30 · 260 阅读 · 0 评论 -
P1972 [SDOI2009] HH的项链(可持续化线段树)
HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义。HH 不断地收集新的贝壳,因此,他的项链变得越来越长。有一天,他突然提出了一个问题:某一段贝壳中,包含了多少种不同的贝壳?于是,他只好求助睿智的你,来解决这个问题。用 一个 rt记录其删掉上次重复的 个数,在赋值到 当前 第 i棵 线段树上。第二行 n 个正整数 ai,表示项链中第 i 个贝壳的种类。接下来 m 行,每行两个整数 l,r,表示询问的区间。输出 m 行,每行一个整数,依次表示询问对应的答案。原创 2024-03-26 15:20:49 · 264 阅读 · 0 评论 -
P1972 [SDOI2009] HH的项链(线段树+离线做法+排序)
HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义。HH 不断地收集新的贝壳,因此,他的项链变得越来越长。有一天,他突然提出了一个问题:某一段贝壳中,包含了多少种不同的贝壳?用 vector v [N ] 记录 的当右端点为 i的 情况下,存储它的第几次询问的小标。用线段树进行上次它前面出现的相同的数,并且记录前面出现的最后一次的下角标。接下来 m 行,每行两个整数 l,r,表示询问的区间。输出 m 行,每行一个整数,依次表示询问对应的答案。原创 2024-03-26 14:57:46 · 397 阅读 · 1 评论 -
P1383 高级打字机(可持续化线段树)
早苗入手了最新的高级打字机。最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧。用可持续化线段树,每次操作的区间的最后一个没有记录的为1个区间。以下 n 行,每行一个命令。保证输入的命令合法。每行输出一个字母,表示 Query 操作的答案。第 11 行:一个整数 n,表示操作数量。时间复杂度为:O(n*longn)文章一开始可以视为空串。原创 2024-03-26 12:03:00 · 153 阅读 · 0 评论 -
P3834 【模板】可持久化线段树 2
如题,给定 n 个整数构成的序列 a,将对于指定的闭区间 [l,r] 查询其区间内的第 k 小值。接下来 m 行每行包含三个整数 l,r,k , 表示查询区间[l,r] 内的第 k 小值。第二行包含 n 个整数,第 i 个整数表示序列的第 i 个元素 ai。2.记录每个历史版本区间节点的个数。判断是否 进入左区间还是右区间。第一行包含两个整数,分别表示序列的长度 n 和查询的个数 m。我们前一篇写了可持续化线段树,我们只需对其进行修改一下即可。对于每次询问,输出一行一个整数表示答案。原创 2024-03-26 11:23:28 · 236 阅读 · 0 评论 -
P3919 【模板】可持久化线段树 1(可持久化数组)
对于操作1,格式为vi 1 loci valuei,即为在版本vi的基础上,将 loci 修改为 valuei。答:线段树是以区间进行搜索递归,只有当左区间等于右区间是,l==r是才可以被赋值,其他时候一般求个数和区间和或区间的最大值。第二行包含N个整数,依次为初始状态下数组各位的值(依次为 ai,1≤i≤N)。并对他进行访问它的左右儿子的节点,将上一版本的左右儿子暂存在当前父节点上。输入的第一行包含两个正整数 N,M, 分别表示数组的长度和操作的个数。访问某个历史版本上的某一位置的值。原创 2024-03-26 10:57:00 · 843 阅读 · 0 评论 -
F. Microcycle(dfs 搜寻路径 + 并查集)
我们可以利用并查集,进行确定其是否有环路。在将所用的边从大到小排序。利用 vector容器,pop_back() 和 push的特性。本题的意思是,求一个环的最小的那条边。起点为 u终点为 v寻找路径。并且输出其这个环的点。原创 2024-03-19 10:38:28 · 185 阅读 · 0 评论 -
平衡子序列的最大和
这个例子中,选择子序列 [3,5,6] ,下标为 0 ,2 和 3 的元素被选中。这个例子中,选择子序列 [5,8] ,下标为 0 和 3 的元素被选中。这是一个平衡子序列,而且它的和是 nums 所有平衡子序列里最大的。f[i] = 以小标 i 结尾的子序列 对应的nums的最大值。所以,这是一个平衡子序列,且它的和是所有平衡子序列里最大的。所以,这是一个平衡子序列,且它的和是所有平衡子序列里最大的。包含下标 1 ,2 和 3 的子序列也是一个平衡的子序列。,如果这个子序列满足以下条件,我们说它是。原创 2023-11-06 09:33:35 · 86 阅读 · 0 评论 -
P3369 【模板】普通平衡树(FHQ Treap树构建和解析)
它的高明之处是所有操作都只用到了分裂和合并这两个基本操作,这两个操作的复杂度都为O(log2 n)。第一行为 n,表示操作的个数,下面 n 行每行有两个数 opt 和 x,opt 表示操作的序号( 1≤opt≤6 )用随机值进行可以确保树的高度比较小,这就是为什么要引入随机值的原因。大根堆是根节点>左节点and 根节点>右节点;对于 100% 的数据,1≤n≤105,∣x∣≤107。3、左右节点+本身的大小(这时在排名上有很大的用处)二叉树搜索树是左节点小于根节点,根节点小于右节点。原创 2023-04-12 18:42:20 · 653 阅读 · 1 评论 -
P3834 【模板】可持久化线段树 2
用前缀和的思想是因为前面记录的久结点而后面开辟的结点的值之间的差值是新添加的多少个结点。区间[L,R]包含的元素等于区间[1,R]减去区间[1,L-1]。可持久线段树是基本线段树的一个简单扩展,它的特点是支持查询历史版本,并且利用历史版本之间的共用数据减少时间和空间的消耗。如题,给定 n 个整数构成的序列 a,将对于指定的闭区间 [l,r] 查询其区间内的第 k 小值。我们在记录权值线段树时,不可能每次都开一颗全新的树进行记录其结点的值。它包含的思想有前缀和思想,共用点,离散化,权值线段树,动态开点。原创 2023-01-06 10:13:41 · 284 阅读 · 0 评论 -
P1972 [SDOI2009] HH的项链(莫队算法)
HH 有一串由各种漂亮的贝壳组成的项链。HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义。HH 不断地收集新的贝壳,因此,他的项链变得越来越长。有一天,他突然提出了一个问题:某一段贝壳中,包含了多少种不同的贝壳?于是,他只好求助睿智的你,来解决这个问题。第二行 n 个正整数 ai,表示项链中第 i 个贝壳的种类。接下来 m 行,每行两个整数 l,r,表示询问的区间。输出 m 行,每行一个整数,依次表示询问对应的答案。第三行一个整数 m,表示 H 询问的个数。原创 2023-01-06 09:35:10 · 181 阅读 · 0 评论 -
hdu Atlantis(线段树:扫描线)
【代码】hdu Atlantis(线段树:扫描线)原创 2023-01-03 16:52:04 · 313 阅读 · 0 评论 -
P3372 【模板】线段树 1
题目描述如题,已知一个数列,你需要进行下面两种操作:将某区间每一个数加上k。求出某区间每一个数的和。输入格式第一行包含两个整数n, m,分别表示该数列数字的个数和操作的总个数。第二行包含n个用空格分隔的整数,其中第i个数字表示数列第i项的初始值。接下来m行每行包含3或4个整数,表示一个操作,具体如下:1 x y k:将区间[x, y][x,y]内每个数加上kk。2 x y:输出区间[x, y][x,y]内每个数的和。输出格式输出包含若干行原创 2022-12-27 15:23:20 · 70 阅读 · 0 评论 -
P4514 上帝造题的七分钟
第二分钟,L 说,要能修改,于是便有了将左上角为 (a,b)(a,b),右下角为 (c,d)(c,d) 的一个矩形区域内的全部数字加上一个值的操作。第六分钟,吃钢琴男说,要省点事,于是便有了保证运算过程中及最终结果均不超过 3232 位有符号整数类型的表示范围的限制。“第一分钟,X 说,要有矩阵,于是便有了一个里面写满了 0 的 n×m 矩阵。第三分钟,k 说,要能查询,于是便有了求给定矩形区域内的全部数字和的操作。第四分钟,彩虹喵说,要基于二叉树的数据结构,于是便有了数据范围。请注意,kk 为小写。原创 2022-12-26 15:51:47 · 85 阅读 · 0 评论 -
P3372 【模板】线段树 (用树状数组实现)
假设求L->R的区间和:sum(L,R) = a[L] +````+a[R];第二行包含 n 个用空格分隔的整数,其中第 i 个数字表示数列第 i 项的初始值。树状数组是高效率的查询和维护前缀和。它在序列是动态变化的情况下也是合适的。第一行包含两个整数 n,m,分别表示该数列数字的个数和操作的总个数。输出包含若干行整数,即为所有操作 2 的结果。原创 2022-12-26 15:26:13 · 94 阅读 · 0 评论 -
hdu 1556 Color the ball(前缀和 or 树状数组)
N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a原创 2022-12-26 14:41:42 · 94 阅读 · 0 评论 -
POJ 2524 Ubiquitous Religions(并查集)
【代码】POJ 2524 Ubiquitous Religions(并查集)原创 2022-12-25 14:52:12 · 83 阅读 · 0 评论 -
并查集原理图解
并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中......原创 2022-07-08 21:14:03 · 88 阅读 · 0 评论 -
冰岛家谱 (25 分)
冰岛是作为一个人口稀少的国家,人群之间具有复杂的血缘关系,为了避免不必要的意外,他们的手机上都安装了一款可以随时查询两个人之间是否有血缘关系的软件。现在你的任务就是实现这样一个功能,接收血缘关系的登记信息,并在我们查询时给出两个人是否具有血缘关系。血缘关系具有自反性、传递性。输入格式:一行整数n,以下n行,每行3个正整数q、a、b若q为1,则登记a与b具有血缘关系若q为2,则查询a与b的血缘关系,若有,输出一行YES;若无,输出一行NO。输出格式:对于每个q=2,输出一行YES或原创 2022-04-06 22:37:52 · 213 阅读 · 0 评论 -
765. 情侣牵手
n 对情侣坐在连续排列的 2n 个座位上,想要牵到对方的手。人和座位由一个整数数组 row 表示,其中 row[i] 是坐在第 i 个座位上的人的 ID。情侣们按顺序编号,第一对是 (0, 1),第二对是 (2, 3),以此类推,最后一对是 (2n-2, 2n-1)。返回 最少交换座位的次数,以便每对情侣可以并肩坐在一起。 每次交换可选择任意两人,让他们站起来交换座位。示例 1:输入: row = [0,2,1,3]输出: 1解释: 只需要交换row[1]和row[2]的位置即可。原创 2022-04-02 22:41:24 · 74 阅读 · 0 评论 -
union-find 并查集
并查集具有动态连通性,它可以理解成“p和q是相连的",具有自反性,对称性,传递性。比如:怎么才可以查到一个陌生人是否和这个家族有血源关系等问题。union-find 算法的APIUF(int N);void union(int p,int q) ;int find(int p) ;boolean connected(int p,int q) ; int count() ;下面我用JAVA写一段并查集的代码:public static class UF { privat.原创 2022-03-28 23:03:15 · 306 阅读 · 0 评论