![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 94
Cu1ii*
平凡的铁匠
展开
-
[数据结构]——单调栈
单调栈笔者在做leetcode的题(下一个出现的最大数字)时,接触到了单调栈这一种数据结构,经过研究之后,发现单调栈在解决某些问题时出奇的好用,下面是对单调栈的性质和一些典型题目。什么是单调栈?从名字上就听的出来,单调栈中存放的数据应该是有序的,所以单调栈也分为单调递增栈和单调递减栈单调递增栈:单调递增栈就是从栈底到栈顶数据是从大到小单调递减栈:单调递减栈就是从栈底到栈顶数据是从小到大模拟单调栈的数据push和pop模拟实现一个递增单调栈:现在有一组数10,3,7,4,12。从左到右转载 2021-03-05 13:13:53 · 228 阅读 · 0 评论 -
线段树 +扫描线
关于线段树辅助扫描线的基本思想,已经有很多大佬去详细的解释了,可以去看一下传送门这里主要说一下线段树辅助扫描线的一些问题以及两种变形关于数据的离散化,离散化很多时候是为了减小空间消耗,但是我认为在线段树辅助扫描线时,基本都是需要进行离散化的,因为在以x(y)为坐标轴时,维护的是[1, m] (m不确定),但是显然坐标轴上的区间点坐标不一定是从1开始的,所以要离散出一个区间其范围是 [1, m]在一般线段树进行区间划分的时候,通常采用下面的方式mid = l + r >> 1;(操原创 2021-02-17 21:09:50 · 364 阅读 · 0 评论 -
关于树状数组的区间修改以及单点查询和区间查询
题目链接下面的题解转于传送门对于想要学习区间修改和单点输出的同学们可以去看这篇文章 传送门假设数组a是原数组,b是a的差分数组,由前缀和的定义,我们求前n个元素的和,即详细过程如下:a1 + a2 + … + an = b1 + (b1 + b2) + …+ (b1 + b2 + b3 + … bn) ->n * b1 + (n - 1) * b2 + … + bn所以我们要先对原数组a进行差分,得到差分数组b,才对b[i]和b[i]*i分别维护一个树状数组tb和tc,而l到r的原创 2020-12-16 02:27:13 · 218 阅读 · 0 评论 -
维修数列-平衡树的硬板子
题目链接 题意就是一个简单的平衡树的板子,但是在实现上有很多细节,蒟蒻的我竟然debug了3天,只能说自己的板子不硬,更新下板子 因为细节挺多的(至少我觉得是,所以就直接以注释的形式写在代码里了)但是要注意,这里说的子列是连续的子列。 因为看网上的题解说的好像在bzoj上一直开新点会内存超限,为了防止也出现这个情况,我特意学了一手节点回收分配(虽然最后也没啥用好像)超长代码(捂脸)#include <bits/stdc++.h>#define ss system("pause");原创 2020-11-08 17:05:23 · 181 阅读 · 0 评论 -
ICPC模拟选拔 Greater New York Regional 2009 (补题)
文章目录ICPC模拟选拔 Greater New York Regional 2009 (补题)该题解参考并转自https://blog.csdn.net/u013050857/article/details/45080467**C**:[poj3783](http://poj.org/problem?id=3783)**D** : [poj3748](http://poj.org/problem?id=3784)题意:思路:代码:**F** :题意:思路:代码ICPC模拟选拔 Greater New原创 2020-10-25 21:51:06 · 150 阅读 · 0 评论 -
2020牛客国庆集训派对day4 F What Goes Up Must Come Down
What Goes Up Must Come Down题意:给一段序列,每次只能移动相邻两位,问最少要移动多少次,才能使整段序列先不单调递减,再不单调递增(允许整段序列单调)思路: 对于这个序列,是不是要把除了最大以外的数想最大项的左右移动,那么我们按照从小到大的顺序移动,对于当前数为我们有两个方向去移动它,第一种是向左移动,第二种是向右移动,所以我们要求出这个数左右两个方向的逆序数,比较我们应该向哪边移动步数最小,当然是选逆序数少的一端,那为什么移动的步数是逆序数呢?因为我们是按照从小到大的顺序进行原创 2020-10-06 19:19:22 · 197 阅读 · 0 评论 -
回文自动机/回文树(模板)
洛谷3649还是封装了比较香#include <iostream>#include <algorithm>#include <cmath>#include <cstdio>#include <cstring>#include <string>#include <stack>#include <queue>#include <map>#include <vector>原创 2020-10-03 20:38:53 · 154 阅读 · 0 评论 -
队列的一些基本操作
依旧是记录手写队列的操作,也依旧是拿之前用stl的queue做的题改成了手写队列去验证队列的正确性由于主要是队列操作,所以题就不去解释了poj 3278#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <vector>#include <string>#include <cmath>#inclu原创 2020-09-18 10:19:12 · 161 阅读 · 0 评论 -
栈的一些基本操作
记录一下栈的一些基本操作,怕忘了这里的栈是顺序栈找了一道要用栈的例题把之前用stl的地方换成了看的书改的自己的手写栈括号配对问题(1)代码#include <iostream>#include <algorithm>#include <cmath>#include <cstdio>#include <cstring>#include <string>#include <stack>#include &原创 2020-09-14 21:25:26 · 112 阅读 · 0 评论 -
线段树 区间合并 poj3368
poj 3368 Frequent values题意:给一个单调不递减的数列,求给定区间内重复最多数字的次数1、RMQ(这里不说这个)2、线段树的区间合并,可以说是一个比较简单的模板吧,至于难的,咱不会啊用线段树进行维护的话,要记录五个值:区间左边界的数字,区间左边界在本区间内的次数,区间右边界的数字 ,区间右边界在本区间内的次数,该区间内出现的最大次数在用线段树维护的时候,不能只对左右区间的值进行比较,还要把两个区间合并(如果 左区间的右边界 == 右区间的左边界)看合并后中间是原创 2020-09-11 17:39:46 · 260 阅读 · 0 评论 -
splay树 模板
越学越把treap , fhq - Treap和splay记混了,splay树在于其区间翻转等操作这里先把一些spla树的基本操作模板给一下可以参考一下这篇文章,关于基本操作的例题(模板)洛谷3369对于模板里的“哨兵”,不太理解,但是没了他还过不了。。这里先留个坑,等弄明白哨兵了之后再来补坑#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>#原创 2020-09-05 15:04:35 · 332 阅读 · 0 评论 -
链表操作
记录下链表操作,留着回忆的时候看#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>#include <queue>#include <vector>#include <string>#include <cmath>#include <cstdlib>using namespace s原创 2020-09-02 19:40:35 · 187 阅读 · 0 评论 -
字典树 例题
关于学习字典树,可以转步这篇文章传送门例题1、poj3630 / hdu 1671这里要在插入时候进行检验是否存在某个号码是已存在号码的前缀或者存在某个号码是当前插入号码的前缀。先说hdu1671,因为poj的使用动态建树给tle了,所以要用静态建树,这里先说动态建树hdu1671 代码(感觉可以做模板)#include <iostream>#include <cstdio>#include <cstring>#include <cmath>原创 2020-08-20 20:34:28 · 228 阅读 · 0 评论 -
(可持久化无旋Treap / stl)
1、利用可持久化无旋Treap2、利用c++的stl容器crope,内部是用平衡树实现的,操作都是O(logN)这里直接转了别人的代码代码出处传送门#include<iostream>#include<cstdio>#include<ext/rope>#include<string>using namespace std;using namespace __gnu_cxx;const int maxn=50005;crope ro,原创 2020-08-08 15:23:47 · 346 阅读 · 0 评论 -
BST poj2309(树状数组lowbit)
题目链接:BST题目很好理解,不再赘述题意思路:看很多文章都说是树状数组,但是我仔细想了想,发现跟树状数组还是有区别的,只能说跟数状数组类似,但是不是树状数组利用树状数组中的lowbit来计算这个二叉树的节点值,从左向下每个节点减的都是当前节点值的lowbit() / 2,那么最后减的总数不就是,给定根节点的lowbit() - 1,同理,从右往下走,加的是根节点的lowbit() - 1,可以拿笔将其转化为二进制试一试,这个值就是根节点lowbit() / 2 的值在二进制的位置然后一直到0原创 2020-08-05 01:50:02 · 147 阅读 · 0 评论 -
Decode the Tree poj2568(Prufer序列)
题目链接:Decode the Tree题意:给出一个Prufer序列,求出这个树思路:首先要知道Prufer序列。对于任意一个无根树,每次去掉一个编号最小的叶子节点,并保存这个节点所连接的节点所得到的序列就是这棵树的Prufer序列。读入序列后,遍历1-n,没有进入序列的节点即为叶子节点,序列中某个节点的出现次数就代表这个节点有几个子节点,开一个数组记录这个节点出现次数,然后下一步感觉和拓扑排序差不多,遍历序列,每一次从优先队列中取出最小的叶子节点,然后与序列中的当前点进行匹配,删除这条边,如原创 2020-08-04 19:41:55 · 332 阅读 · 0 评论 -
poj 1785 Binary Search Heap Construction
题目链接:Binary Search Heap Construction就是建立一个二叉平衡树刚开始用的treap,tle了,看了这篇文章后发现,如果数据给的是一条链的,那么时间复杂度会达到O(n^2),稳定tle,但是zoj 2243由于给的时间限制是5ms所以treap是可以过的文章链接传送门先把tle的代码贴出来吧T—T#include <iostream>#include <cstdio>#include <cstring>#include &l原创 2020-08-04 02:54:42 · 184 阅读 · 0 评论 -
二叉查找树 +Treap
二叉查找树Treap原创 2020-08-04 01:23:16 · 165 阅读 · 0 评论 -
poj 1577 Falling Leaves
题目链接:poj 1577 Falling Leaves题意:给一个从上到下,从左到右的二叉搜索树的序列,让你根据这个序列建立相应的二叉搜索树,并按照前序遍历输出思路:将给的序列逆序建树,然后在前序遍历即可#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <string>#include <cmath>原创 2020-08-03 02:54:41 · 268 阅读 · 0 评论 -
The order of a Tree hdu3999 二叉搜索树
题目链接:hdu3999 The order of a Tree题意:给一个二叉搜索树的序列,求输出可以构成这个二叉搜索树的且满足字典序最小的插入序列找了一个比较具体描述怎么根据序列建立二叉搜索树的图片来自:https://blog.csdn.net/qq_39290830/article/details/85197994思路:首先,根据输入键的顺序,构造对应的二叉搜索树;然后,前序遍历这棵二叉树,得出的树的顺序就是以最小的字典序生成的相同形状的树。#include <iostre原创 2020-07-31 22:02:00 · 179 阅读 · 0 评论 -
poj 3437 Tree Grafting(多叉树转二叉树)
题目链接:poj 3437 Tree Grafting题意:给一个多叉树的序列,d表示向下加一个子节点,u表示返回上一层的父节点问这么一个多叉树的高度转为二叉树,这个二叉树的高度有多高转二叉树的方法题目已经告诉你了:“左儿子,右兄弟”就是将一个节点的第一个儿子放在左儿子的位置,下一个的儿子,即左儿子的第一个兄弟,放在左儿子的右儿子位置上,再下一个兄弟接着放在右儿子的右儿子.我们不难发现,对于多叉树,每d一次就是当前节点深度+1,我们只需要比较加完深度之后从这个节点到根节点的树高是不是在这原创 2020-07-30 18:30:11 · 273 阅读 · 0 评论 -
poj 2499 Binary Tree
题目链接poj 2499 Binary Tree题意:从根节点(1,1)开始,往当前节点(a,b)的左子节点走,坐标变化为(a + b,b),往右子节点走坐标变化为(a,b + a),问给出一个终点坐标,问从根节点到这个点向左走了几次,向右走了几次思路:我们可以倒着推,从终点推起点,因为除了根节点以外,不可能再有一个点的坐标是a和b相等,如果a > b说明这个点是又上个节点向左走得到的,则left要增加1,反之说明这个点是由上个节点向右走得到的,则right要增加1。但是这样减法递减的话会t原创 2020-07-30 15:59:38 · 198 阅读 · 0 评论 -
Tree Recovery poj2255(前序中序遍历建立二叉树)
题目链接:Tree Recovery poj2255题意:给出一个前序遍历序列和中序遍历序列,输出后序遍历序列跟之前的给后序和中序遍历序列一样#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <string>#include <cmath>#include <vector>#include原创 2020-07-30 14:03:23 · 227 阅读 · 1 评论 -
URAL - 1136 Parliament(后序中序遍历建立二叉树)
题目链接URAL - 1136 Parliament题意:规定:左结点的值<根结点的值<右结点的值然后给你一个后序遍历的序列,让你按照右节点 > 左节点 > 根节点的顺序输出这个二叉树思路:我们首先要建树,但是,我们只有后序遍历的序列,是不能建成树的,我们还需要中序遍历的序列,但是我们观察节点值的大小顺序发现,将二叉树结点的值按照升序排列,就可以得到中序遍历的序列,那么建树这个问题就解决了,那么如何按要求的顺序输出?可以发现,这个顺序就是把前序遍历反向输出就可以,我们可以原创 2020-07-30 02:46:20 · 151 阅读 · 0 评论 -
Tree(中序遍历和后序遍历建二叉树)
Tree 题意:给你中序遍历序列和后序遍历序列,要你找出这棵树中从根节点到任意叶子节点的最小值中的叶子节点的值。思路分析:根据中序和后序遍历的序列建树(需要同时应用两个序列的信息才能进行建树)我们需要通过后序遍历序列的最后一位来得到当前规模的子树的根节点,再利用中序遍历得到左右子树节点的规模,将当前树拆分为左右子树进行递归得到所要建立的二叉树建完树后,只需要利用dfs按二叉树的结构进行查找就可以了对于处理输入数据,学到了#include <iostream>#include &原创 2020-07-30 00:27:57 · 270 阅读 · 0 评论 -
S-Trees poj1105(二叉树)
题目链接http://poj.org/problem?id=1105题意:给一个已知层数的满二叉树和每个叶子节点的值,(只有0,1),然后每个节点有两种选择,0是从该节点向左子树走,1是右子树,问给一串操作序列,每个操作序列都对应了底层的一个叶子节点,问这串操作序列得到的01串为多少思路:满二叉树的叶子节点个数为2的n次方个,所以,我们可以用一维数组去存储这些叶子节点,然后下标为0-2 ^ n -1;同时我们可以发现,将每个操作序列看作二进制并进行转换为10进制后,就是我们要得到的存储目标叶子节点原创 2020-07-29 21:54:12 · 138 阅读 · 0 评论 -
Subtrees hdu5524(完全二叉树)
题目链接Subtrees题意:给出一个完全二叉树的节点数,求其不同节点数的子树的个数思路:1、先考虑是否为满二叉树,如果是满二叉树,那么不同节点子树的个数即为该而二叉树的层数2、如果不为满二叉树,那么就寻找该二叉树的最大满二叉树,记录这个层数最大的满二叉树的层数,那么剩下的子树就是小于最大层数的满二叉树这时候就只需要去重,还有一部分子树是非完全二叉树,那么就看以该节点为根节点的二叉树是否为非满完全二叉树,如果是,就+1,并继续向下寻找,直至叶子节点,因为每一层的非满完全二叉树的节点数肯定不同#i原创 2020-07-29 04:10:23 · 147 阅读 · 0 评论 -
二叉树的应用---后缀表达式构建表达树(poj3367)
题目链接Expressions如果不懂什么是后缀表达式构建表达树的可以参考这篇文章https://blog.csdn.net/qq_26849233/article/details/72910010题意:给出一个后缀表达式,让你建成二叉树后,按照下至上,从右至左,将其输出在建完树之后,按照层序输出然后在把式子反转即可#include <iostream>#include <cstdio>#include <algorithm>#include <c原创 2020-07-28 19:42:45 · 744 阅读 · 0 评论 -
Dropping Balls(满二叉树,思维)
UVA679 小球下落 Dropping Balls题目翻译:许多的小球一个一个的从一棵满二叉树上掉下来组成一个新满二叉树,每一时间,一个正在下降的球第一个访问的是非叶子节点。然后继续下降时,或者走右子树,或者走左子树,直到访问到叶子节点。决定球运动方向的是每个节点的布尔值。最初,所有的节点都是 FALSE,当访问到一个节点时,如果这个节点是 FALSE,则这个球把它变成 TRUE,然后从左子树走,继续它的旅程。如果节点是TRUE,则球也会改变它为 FALSE,而接下来从右子树走。满二叉树的标记方原创 2020-07-28 14:19:15 · 548 阅读 · 0 评论 -
什么是二叉树,二叉树及其性质详解
文章转自http://data.biancheng.net/view/192.html简单地理解,满足以下两个条件的树就是二叉树:本身是有序树;树中包含的各个节点的度不能超过 2,即只能是 0、1 或者 2;例如,图 1a) 就是一棵二叉树,而图 1b) 则不是。二叉树的性质经过前人的总结,二叉树具有以下几个性质:1、二叉树中,第 i 层最多有 2^(i-1) 个结点。2、如果二叉树的深度为 K,那么此二叉树最多有 2^(K-1) 个结点。3、二叉树中,终端结点数(叶子结点数)为 n0,转载 2020-07-28 13:41:15 · 478 阅读 · 0 评论 -
树状数组
集训的时候学的树状数组,写个博客记录一下,下面理论是讲课的pdf挺清楚的.记录两个例题1、Apple Tree这个题算是线状数组和线段树的板子,但是处理的时候要把点都转化为区间,这时候就要用dfs去后序遍历树了,即把第一次到该节点的值当作该点区间的左边界,第二次回溯到该节点时的值当作区间右边界#include <iostream>#include <cstdio>#include <cstring>#include <string>#inc原创 2020-07-27 02:40:20 · 136 阅读 · 0 评论 -
Vases and Flowers (线段树 + 二分)
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4614题意:有n个花瓶,标号0 ~ n−1。m个操作,1AF,表示从A位置开始插FF朵花,遇到有花的花瓶跳过。到最后一个花瓶都还有花剩余,丢弃剩下的花。2AB,表示将区间[A,B]内的花瓶全部清空。(A≤B)(A≤B)对于每个11操作,输出第一个和最后一个插花的位置,如果一朵花都插不了,输出‘Can not put any one.’;对于每个2操作,输出区间[A,B]内被清空的花瓶的数量。思路:原创 2020-07-16 11:49:08 · 175 阅读 · 0 评论 -
poj2528 Mayor‘s posters 线段树 +离散化
题目链接http://poj.org/problem?id=2528思路:每次贴海报,就把目标区间内的颜色标号标记成当前海报颜色标号,最后查询整个墙的分区间内所以不同颜色的数量就可以但是因为墙的长度太长了,如果直接用线段树,就会内存超限,所以要进行离散化处理,这里是区间的离散化处理,这里我引用了别的博主的话引用文章https://blog.csdn.net/sugarbliss/article/details/80501556原来的:1 2 3 4 6 7 8 10 (去重后排序原创 2020-07-15 21:23:55 · 182 阅读 · 0 评论 -
Transformation HDU - 4578
写之前看到了大佬的文章,思路请移步大佬文章链接Transformation HDU - 4578 多重懒标记 || 简洁暴力做法题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4578多重懒标记暴力做法#include <iostream>#include <cstdio>using namespace std;typedef long long ll;const int maxn = 100010;const ll原创 2020-07-15 14:54:36 · 165 阅读 · 0 评论 -
线段树(例题)
线段树tq(巨佬太强了)l题目链接1、hdu1166敌兵布阵最基础的线段树应用,这里没有用上区间修改,但是这个题可以当个板子/*递归方法*/#include <iostream>#include <cstring>#include <string>#include <cstdio>using namespace std;const int maxn = 50000 + 5;//元素总个数int p[4 * maxn],add[4 *原创 2020-07-11 15:53:13 · 213 阅读 · 0 评论 -
程序设计综合实训——高校教师信息管理系统(数据结构,单向链表)
其实这个用数组,很容易就可以完成,但是为了学习数据结构,还是用链表写的题目:编写一套计算机学院教师信息管理系统,用菜单进行管理,具备输入、显示、查找、排序、插入等功能。每一条记录包括一位教师的职工号、姓名、职称、性别、2门主讲课程,包括课程名称、开课学期、课程性质(必修/限选课)和教学效果,以及教学效果综合评分。话不多说,直接上代码吧,代码比语言描述清晰#include <iostream>#include <cstdio>#include <string>原创 2020-06-23 03:17:56 · 4934 阅读 · 3 评论 -
迷宫问题(dfs)(顺序栈实现)
传送门其实吧,走迷宫问题我个人觉得,还是bfs更好一些,但是实验题为了联系栈的使用,估计是把数据针对了一手,bfs跑不了,那就dfs吧跟正常的dfs一样,但是感觉可以剪下枝,具体的看代码吧,dfs思路还是很简单的#include <cstdio>#include <cstdlib>#include <iostream>const int MAXN = 105,MAX = 1e3;int maps[MAXN][MAXN],vis[MAXN][MAXN];//原创 2020-06-15 20:29:39 · 507 阅读 · 0 评论 -
数据结构 顺序表(持续更新)
顺序表的储存结构,为顺序储存,即表中元素按照表中的顺序存储到一片连续的内存中,逻辑上两个相邻的元素内存中的地址也是相邻的。顺序储存的线性表叫做顺序表。这里先给出一些顺序表的操作/*顺序表简单操作: * 建立,删除,插入,查找 * 部分函数返回值由于蒟蒻太懒,所以修改就不写了,跟查找思路差不多 * * * ******************************************************/#include <cstdio>#include &l原创 2020-06-13 03:09:05 · 218 阅读 · 0 评论 -
约瑟夫问题No.2
n 个小孩围坐成一圈,并按顺时针编号为1,2,…,n,从编号为 p 的小孩顺时针依次报数,由1报到m ,当报到 m 时,该小孩从圈中出去,然后下一个再从1报数,当报到 m 时再出去。如此反复,直至所有的小孩都从圈中出去。请按出去的先后顺序输出小孩的编号。Input每行是用空格分开的三个整数,第一个是n,第二个是p,第三个是m (0 < m,n < 300)。最后一行是:0 0 0...原创 2020-04-10 22:04:00 · 178 阅读 · 0 评论 -
括号配对(栈和队列)
Description假设一个算术表达式中可以包含三种括号:圆括号“(”和“)”,方括号“[”和“]”和花括号“{”和“ ”,且这三种括号可按任意的次序嵌套使用(如:…[…{… …[…]…]…[…]…(…)…)。编写判别给定表达式中所含括号是否正确配对出现的算法。输出结果YES 或者 NO。Input5+{[2X5]+2}OutputYESSample Input8-[{2+7]}...原创 2020-04-10 21:58:38 · 403 阅读 · 0 评论