数据结构
文章平均质量分 81
OI 中数据结构有关题目。
Plozia
这个作者很懒,什么都没留下…
展开
-
P5227 [AHOI2013]连通图 题解
线段树分治套路好题。原创 2022-03-30 21:36:53 · 763 阅读 · 0 评论 -
数据结构专题 - 学习笔记:线段树分治
线段树分治的学习笔记。原创 2022-03-30 16:56:01 · 1617 阅读 · 0 评论 -
P3899 [湖南集训]更为厉害 题解
一道线段树专题的基础题。原创 2022-03-23 16:43:02 · 465 阅读 · 0 评论 -
P5278 算术天才⑨与等差数列 题解
一道不错的线段树题目。原创 2022-02-27 21:41:52 · 234 阅读 · 0 评论 -
P3521 [POI2011]ROT-Tree Rotations 题解
线段树合并。原创 2022-02-01 19:51:39 · 1178 阅读 · 0 评论 -
数据结构专题-学习笔记:K - D Tree
数据结构专题 - 学习笔记:K - D Tree 的学习笔记。原创 2022-01-24 21:29:18 · 811 阅读 · 1 评论 -
数据结构专题-学习笔记:李超线段树
李超线段树的学习笔记。原创 2022-01-11 21:14:26 · 592 阅读 · 0 评论 -
P4198 楼房重建 题解
一道线段树题目,很巧妙,主要是在 Update 函数上。原创 2022-01-02 14:54:21 · 345 阅读 · 0 评论 -
P2042 [NOI2005] 维护数列 题解
一道数据结构题,细节特别多。原创 2021-12-29 21:57:25 · 735 阅读 · 0 评论 -
P3320 [SDOI2015]寻宝游戏 题解
一道虚树题,但严格意义上跟虚树没啥关系,实际上更像思维题原创 2021-12-16 21:41:58 · 2058 阅读 · 0 评论 -
数据结构专题-学习笔记:线段树合并
数据结构专题 - 线段树合并的学习笔记。原创 2021-12-08 21:52:21 · 791 阅读 · 0 评论 -
图论专题-学习笔记:虚树
图论专题-学习笔记:虚树1. 前言2. 详解2.1 虚树定义2.2 虚树构造2.3 例题3. 总结4. 参考资料1. 前言虚树,主要是用于一类树上问题,这类问题通常是需要取一些关键点,然后要在这些关键点和其 LCA 上做一些奇怪的玩意。关键前置知识:LCA。2. 详解2.1 虚树定义首先我们需要知道虚树是什么:现在给出一棵 nnn 个点的树,从中选取出 kkk 个关键点,这些关键点以及其两两的 LCA 构成了对于这些关键点而言的虚树,特别注意如果取出来的树不连通的话我们还需要一个根节点来连通。原创 2021-12-01 21:16:51 · 420 阅读 · 0 评论 -
P7446 [Ynoi2007] rfplca 题解
Ynoi 的为数不多的不卡常分块题。原创 2021-11-26 21:03:20 · 225 阅读 · 0 评论 -
P5309 [Ynoi2011] 初始化 题解
看到 Ynoi 题,就要想到根号算法 + 卡常。这什么毒瘤卡常题()显然对序列分块,这样可以维护查询,但是怎么修改呢?考虑到修改操作的步长为 xxx,那么设一个阈值 ppp,对于 x≥px \geq px≥p 暴力跳暴力修改,对于 x<px < px<p 另外想办法,实际上就是一个根号分治思想。发现题目保证 y≤xy \leq xy≤x,于是我们可以假想以 xxx 为周期进行序列分块,然后发现我们只需要维护这个块的第一个块的信息,就可以推知整个序列的信息,因为这玩意有周期性。然后对原创 2021-11-24 16:45:47 · 251 阅读 · 0 评论 -
数据结构专题-学习笔记:可并堆 - 左偏树
左偏树学习笔记。原创 2021-09-27 20:57:47 · 335 阅读 · 0 评论 -
CF1401E Divide Square 题解
一道套路题。考虑将所有的横线分个类,左端点在边界上的为 1 类(L 类),右端点在边界上的为 1 类(R 类),左右都在边界上的随意分,然后将所有的竖线按照其 xxx 升序排序。开两个值域线段树(能支持单点修改区间查询即可),一棵维护 L 类,一棵维护 R 类。理论上一棵也可行,但是两棵理解方便。将所有竖线从左到右依次统计竖线分割横线所创造的贡献,对于一条横线而言,首先将 R 类里面所有左端点小于等于当前竖线 xxx 的线丢到线段树里,将 L 类里面所有右端点大于当前竖线 xxx 的删掉,这样线原创 2021-08-12 14:09:25 · 146 阅读 · 0 评论 -
CF1479D Odd Mineral Resource 题解
本题有两种算法,一种是 logn\log nlogn 级别算法,一种是 n\sqrt{n}n 级别算法,这里只讲根号算法。这道题就是一个树上数颜色问题,只是颜色被限定在一个区间。如果你做过 P4396 [AHOI2013]作业,我相信你能一眼看出这道题的做法。数颜色问题的根号算法做法一般是莫队,而这道题是树上莫队。如果你没学过莫队,看一下我的算法总结。如果你没学过树上莫队但是学过莫队,可以看我的算法总结,也可以在代码后面看我写的简要描述。好的下面默认你学会了树上莫队。那么有一种方法就是我们原创 2021-07-22 15:10:42 · 180 阅读 · 0 评论 -
P4396 [AHOI2013]作业 题解
一道莫队好题。我们需要考虑的是如何去统计一个区间内的符合题意的答案。这里有两种做法:做法一:树状数组/线段树。我们可以开一个值域树状数组/值域线段树,在每一次莫队增/删的时候我们在对应位置进行单点修改操作,维护一下一个区间内的数的个数以及不同数的个数。最后统计答案的时候,进行一次区间查找操作。时间复杂度分析(不计预处理复杂度):莫队转移复杂度是 O(nm)O(n \sqrt{m})O(nm),其中块长是 nm\dfrac{n}{\sqrt{m}}mn,块数是 m\sqrt{m}m,在原创 2021-07-10 18:57:06 · 128 阅读 · 0 评论 -
P4211 [LNOI2014]LCA 题解
设询问 (l,r,z)(l,r,z)(l,r,z) 表示 ∑i=1rdep[LCA(i,z)]\sum_{i=1}^{r}dep[LCA(i,z)]∑i=1rdep[LCA(i,z)]。首先先对询问式做一个差分:(l,r,z)=(1,r,z)−(1,l−1,z)(l,r,z)=(1,r,z)-(1,l-1,z)(l,r,z)=(1,r,z)−(1,l−1,z)那么我们可以考虑将一个询问 (l,r,z)(l,r,z)(l,r,z) 拆成两个询问 (1,r,z)(1,r,z)(1,r,z) 和 (1,l原创 2021-07-01 15:33:05 · 153 阅读 · 0 评论 -
P3396 哈希冲突 题解
这道题是一道根号算法题目,但是并不是分块,而是一种新科技——根号分治。根号分治的具体思想就是:设置一个阈值 ppp,询问小于阈值的时候想办法快速计算答案,询问大于阈值的时候暴力计算答案,一般取 p=np=\sqrt{n}p=n。什么意思呢?拿这道题讲解一下。这道题设置一个阈值 p=np=\sqrt{n}p=n,表示询问时模数的阈值。模数大于阈值这个直接暴力做就可以了,设询问的池为 xxx,每一次不断加上询问的模数即可,因为此时保证模数大于阈值 p=np=\sqrt{n}p=n,那么可以保原创 2021-04-12 21:37:10 · 143 阅读 · 0 评论 -
算法学习笔记:再谈莫队二次离线
算法学习笔记:再谈莫队二次离线1. 前言2. 模板3. 总结1. 前言莫队二次离线,是一种莫队,由 lxl 发明,专门用来处理莫队中转移不是 O(1)O(1)O(1),但是可以前缀和拆分的问题。如果您看到了标题,会注意到 再谈 二字。其实作者之前写过一篇莫队二次离线的博客,但是现在看来感觉理解太浅了,于是决定重新写一篇。在学习之前,请先确保对莫队有一定的了解度,包括但不限于普通莫队及其优化。如果您不知道普通莫队是什么,可以看一看我的 这篇博文。2. 模板模板题:P4887 【模板】莫队二次离原创 2021-03-19 12:55:31 · 524 阅读 · 0 评论 -
平衡树算法总结&专题训练3
平衡树算法总结&专题训练31. 回顾2. 例题3. 总结1. 回顾在这两篇博文中:平衡树算法总结&专题训练1(无旋平衡树:替罪羊树,FHQ Treap)平衡树算法总结&专题训练2(有旋平衡树:AVL 树,Splay)我们重点学习了 4 种平衡树。当然考虑到在 OI 的实用性以及思维性,我个人认为:FHQ Treap 和 Splay 一定要掌握!替罪羊树的思想也非常重要,在某些题目当中有重大的作用。AVL 树…其实在 OI 中不学也没有多大问题。那么接下来我原创 2021-01-25 20:53:20 · 328 阅读 · 0 评论 -
平衡树算法总结&专题训练2(有旋平衡树:AVL 树,Splay)
平衡树算法总结&专题训练2(有旋平衡树:AVL 树,Splay)1.概述2.有旋平衡树-AVL 树1.概述在 平衡树算法总结&专题训练1 中我们着重讲解了两种无旋平衡树:替罪羊树,FHQ Treap。那么在这篇博文中我们将讲解 AVL 树和 Splay 这两种有旋平衡树。有旋平衡树维持树平衡的方法通常都是树旋转。我专门写了一篇文章来讲树旋转->link,请务必保证在学透树旋转之后再往下看,否则会看不懂的。那么还是以模板为例,看看 AVL 树和 Splay 又会有怎样的表现。原创 2020-12-30 19:52:45 · 420 阅读 · 0 评论 -
浅谈树旋转
浅谈树旋转1.概述2.旋转2.1 总览2.2 右旋2.3 左旋3.代码1.概述树旋转,是 AVL 树和 Splay 等平衡树控制平衡的一种办法,同时也在别的领域有着重要的应用。那么什么是树旋转呢?又有什么类型呢?2.旋转2.1 总览比如下面这两棵树,上面的树对 0 号节点右旋后成为下面的树,下面的树对 1 号节点左旋后成为上面的树。那么怎么做树旋转呢?这里给大家一句口诀(也是我从一些算法视频上学到的,并非原创):左旋拎右左挂右,右旋拎左右挂左。什么意思呢?别急,等我细细道来。2.2 右原创 2020-12-30 19:42:19 · 1848 阅读 · 2 评论 -
平衡树算法总结&专题训练1(无旋平衡树:替罪羊树,FHQ Treap)
1.概述平衡树,是一种高级数据结构,是基于二叉查找树的一种数据结构。对二叉查找树不理解的读者这里有一个作者的简单总结:对于一棵二叉查找树(又名 BST):这是一棵二叉树。对于树上的任意节点,其左孩子的权值一定小于父亲,右孩子的权值一定大于等于父亲。二叉查找树支持插入一个数,删除一个数,查找某数的排名,查找某数的前驱/后继等等。比如下面这个就是一棵二叉查找树。那么想必现在你已经知道二叉查找树是什么了。根据理论证明,二叉查找树在 随机数据 的情况下表现良好,平均时间复杂度是 O(nlog原创 2020-12-29 21:51:31 · 395 阅读 · 0 评论 -
线段树算法总结&专题训练4(可持久化线段树)
回顾在 线段树算法总结&专题训练3 中我们见识了 GSS1-5 的题目如何用线段树解决,那么现在就让我们看一看由线段树引申的算法——主席树(可持久化线段树)。那么闲话不多说,开始吧!1.概述1.可持久化是个啥?首先让我们看看『可持久化』是什么意思。在之前我们做到的线段树的所有题目中,我们都是针对当前的线段树直接修改/查询,但是有这样一类题目:它要求在第 kkk 次操作后进行修改,查询,这种问题就是『可持久化』。接下来先说明一些名词及解释:『历史版本/版本』:指在某一次修改/查询之后原创 2020-12-25 21:33:12 · 239 阅读 · 1 评论 -
线段树算法总结&专题训练3
回顾在 线段树算法总结&专题训练2 中我们见识了线段树的各种神奇应用,同时了解了解线段树题目的五部曲:我们需要维护什么?线段树的每个叶子节点是什么?需要 lazy_tag 吗?lazy_tag 又要维护什么呢?要不要重载运算符?最后又要怎么修改?怎么查询?那么,我们来看看如何将这五部曲运用到 GSS1-5 上(之所以没有 GSS6-8 是因为他们不是线段树)。这里对不知道 GSS 系列的题目的人做一个说明:GSS 系列题目都是数据结构题,而且都是基于树结构之上(比如线段树,平衡树原创 2020-12-22 21:13:05 · 323 阅读 · 0 评论 -
线段树算法总结&专题训练2
线段树的算法总结和专题训练。原创 2020-12-22 14:56:40 · 291 阅读 · 2 评论 -
线段树算法总结&专题训练1
1.概述线段树,顾名思义,是一种基于树的数据结构。线段树跟分块一样,也是用来支持区间操作的(比如区间加,区间求和,区间求 maxmaxmax 等等),而且线段树可以支持很多树状数组做不到的内容;换言之,我们可以将线段树看作升级版的树状数组。而且线段树的可扩展性很强,很多的数据结构都是从线段树上扩展的。不过线段树也有一些弱点,比如常数比较大,不能支持插入/删除操作,没有办法维护一些东西(但是分块却可以轻易的实现)等等。所以,虽然线段树可以完成很多事情,但是同样要熟练掌握树状数组与分块。卡常的题目就要用树原创 2020-12-21 13:19:07 · 509 阅读 · 0 评论 -
分块算法总结&专题训练
1.概述分块,被称为优雅的暴力,实质上分块就是一种暴力算法。但是分块因其优美性与可扩展性,使得很多题目往往用分块做更简洁。而分块的最重要的一句话就是:大块维护,小块朴素。分块被称为暴力是因为其时间复杂度是 O(nn)O(n\sqrt n)O(nn) ,如果卡常不当就可能会被卡掉,或者直接卡成 O(n2)O(n^2)O(n2)。莫队算法也是基于分块的(有兴趣了解莫队的可以看一看我的 这篇博文),并且很多用线段树、树套树等算法做的题目往往用分块可以吊打 std。因此,分块还是很重要的一种算法。接下来通原创 2020-12-12 11:37:55 · 430 阅读 · 1 评论 -
莫队算法总结&专题训练3
回顾:一个莫队,六种方法(普通莫队、带修莫队、树上莫队、树上带修莫队、回滚莫队/不删除莫队、莫队二次离线/第十四分块(前体)),连续写了三篇博文来讲述。本篇博文是最后一篇,将会讲述最后两种莫队:[回滚莫队/不删除莫队] [莫队二次离线/第十四分快(前体)],同时将会总结六种莫队算法。3.练习题题单:(前面的就略去了)回滚莫队/不删除莫队P5906 【模板】回滚莫队&不删除莫队AT1219 歴史の研究莫队二次离线P4887 【模板】莫队二次离线(第十四分块(前体))回滚莫队/不删原创 2020-12-09 21:31:36 · 381 阅读 · 0 评论 -
莫队算法总结&专题训练2
上回我们在莫队算法总结&专题训练1讲解了莫队的一般套路以及各种优化方式,但那只是基础,接下来将会介绍莫队更多的用法。3.练习题题单:普通练手题CF220B Little Elephant and ArrayP2709 小 B 的询问P1494 [国家集训队]小 Z 的袜子带修莫队P1903 [国家集训队]数颜色 / 维护队列树上莫队SP10707 COT2 - Count on a tree II树上带修莫队P4074 [WC2013]糖果公园回滚莫队/不删除莫队P59原创 2020-12-09 20:34:04 · 283 阅读 · 0 评论 -
莫队算法总结&专题训练1
1.概述莫队算法,是由莫涛队长提出的一种,能够以玄学的复杂度来处理区间查询类的问题。甲:区间查询类的问题不是可以用线段树等数据结构解决的吗?乙:那如果要求某个区间的区间众数要怎么办呢?甲:啊这。。。。。。所以,莫队算法就是用来解决这种线段树等数据结构不好维护的区间查询问题。这里先安利几个博客,写的非常好,建议各位读者可以看一看,写的比我好多了:莫队算法——从入门到黑题(强烈推荐)洛谷日报 #48 期:莫队算法初探洛谷日报 #183 期:你以为莫队只能离线?莫队的在线化改造(难度较高,建议原创 2020-12-08 21:48:53 · 518 阅读 · 0 评论 -
单调栈算法总结&专题训练
目前还没有完成。1.概述单调栈,是一种数据结构,与单调队列相似。单调队列使用双端队列维护,队列内元素单调递增或单调递减。单调栈则使用普通的栈维护,栈内元素单调递增或单调递减。接下来,通过一道例题,来看一下单调栈的基本操作。2.例题link作为例题,我将会详细讲解单调栈的用法。单调栈其实类似于单调队列(不了解的可以看一看这篇文章),只不过在维护时不需要考虑元素过时问题。通常,单调栈分为两种:单调递增栈与单调递减栈。单调递增栈:栈内元素单调递增。(如 1 2 3)单调递减栈:栈内元素单原创 2020-11-19 20:16:33 · 520 阅读 · 0 评论 -
单调队列算法总结&专题训练
单调队列常常用来维护固定数组中固定长度区间的最大最小值,通常使用双端队列实现。啥意思?以这道模板题为例,讲述单调队列的用法。link手造一组样例(与例题所给略有不同):(n=8,k=3n=8,k=3n=8,k=3)1 3 -1 -3 5 6 7 7以求最小值为例,建立一个双端队列。循环 iii 从 1 到 nnn 。i=1i=1i=1 时,队列为空,插入 a1a_1a1 。队列: 1 ,最小值为 1 。i=2i=2i=2 时,a2=3a_2=3a2=3,比 队首元素 要大,难道我们就要残原创 2020-11-11 20:34:50 · 406 阅读 · 0 评论 -
CF722C Destroying Array 题解
根据目前作者了解,本题有两种解法:并查集+线段树。1. 并查集我们倒过来思考,将删除操作变为插入操作,相邻点合并。考虑到序列里面的数都为正数,那么直接取出子树权值和最大的即可。预计时间复杂度 O(n)O(n)O(n),上界 O(nlogn)O(n \log n)O(nlogn)。2. 线段树这个需要模仿 GSS 系列,维护前缀和,后缀和,总和,最大子段和,然后删除操作处理成最小值。这个方法支持数为负数的情况。没了解过 GSS 系列的读者可以看一看这篇文章:线段树算法总结&专题训练3原创 2021-02-09 09:42:13 · 100 阅读 · 0 评论 -
CF103D Time to Raid Cowavans 题解
这道题看似可以线段树乱搞,但是真正用线段树就会发现根本没有用。因此我们考虑根号算法。难道是分块?错!还有一种根号算法——根号分治。根号分治的思想就是设定阈值 SSS ,大于阈值的暴力计算,小于阈值的快速计算,而取 S=nS = \sqrt nS=n 时最优(不要问我怎么证明)。那么这道题,我们针对 kik_iki 手动设定阈值为 500,大于 500 直接计算,小于等于 500 前缀和计算,但是因为这道题卡空间,因此我们需要对询问离线,同时处理相同的 kik_iki 即可。代码:#incl原创 2021-01-08 21:16:14 · 157 阅读 · 0 评论 -
CF86D Powerful array 题解
看到长这样的题目,显然是莫队板子题。但是不知道为什么很多人写的都是 2×cntx+12 \times cnt_x + 12×cntx+1 之类的?好像直接先减再加不就好了?公式都不用推。注意指针顺序以及 long long。代码:#include <bits/stdc++.h>using namespace std;typedef long long LL;const int MAXA = 1e6 + 10, MAXN = 2e5 + 10;int n, m, cnt[MAX原创 2021-01-06 15:49:50 · 114 阅读 · 0 评论 -
CF292D Connected Components 题解
这道题给各位一种不一样的做法。首先显然可以使用并查集维护连通块个数,但是我们知道并查集 不支持删除,而题目是 区间询问,所以:不支持删除+区间询问=回滚莫队!所以这道题可以用回滚莫队通过,没学过的可以看看 这篇博文。然后呢?我们让 rrr 初始为 mmm ,lll 为 (i−1)∗block+1(i - 1) * block + 1(i−1)∗block+1,反向回滚莫队即可。代码:#include <bits/stdc++.h>using namespace std;type原创 2021-01-06 11:36:54 · 273 阅读 · 0 评论 -
CF920F SUM and REPLACE 题解
线段树好题。首先,如果做过 P4145 上帝造题的七分钟2 / 花神游历各国 ,那么这道题还是十分好想的。我们需要意识到一个问题:对于 1,21,21,2 这两个数而言,我们对它们修改是没有意义的,111 还是 111,222 还是 222。那么我们再想想,对于 aia_iai 几次操作之后就会变成 1,21,21,2 呢?我们可以 使用数学方法 打一个暴力程序算一算,发现最多不超过 6 次。于是这不就变成上面那道题了吗?我们先预处理出 did_idi,然后线段树维护两个值 sum,maxs原创 2020-12-29 12:47:46 · 96 阅读 · 0 评论