
数据结构
文章平均质量分 69
sunday_soft
毕业于东北大学,做教师和软件开发工作
展开
-
dfs序(树形结构线性化)
通过观察可以发现,以x 为根的子树在一个连续的区间,即在x 入栈和出栈之间,因此,如果要对子树进行操作,可以看作对一个区间进行操作,且这个区间对应新的线性序列中的in[x] out[x]。如对结点B根的子树进行操作,则对应线性序列区间in[B] out[B],即区间[2,5]进行操作。id[x]:表示结点x在新的线性序列中的下标, id[x]=in[x]。对单个结点x进行修改,则对应新的线性序列对id[x]进行修改。out[x]:表示结点x出栈的时间戳,特殊的,出栈不算时间。原创 2022-12-09 16:53:14 · 2025 阅读 · 0 评论 -
二叉搜索树
和堆一样,实际上不需要我们自己实现二叉搜索树。许多编程语言都在标准库里实现了简单易用的二叉搜索树。set是像前面所说的一样使用二叉搜索树维护集合的容器,而map则是维护键和键对应的值的容器。所有节点都满足,左子树上的所有节点都比自己小,而右子树的节点都比自己大。以上两种情况都不满足的话,把左儿子的子孙中最大节点提到需要删除的节点上。需要删除节点的左儿子没有右儿子,那么就把左儿子提上去。需要删除节点没有左儿子,那么就把右儿子提上去。3、二叉搜索树的复杂度都为O(log n)原创 2022-09-18 09:11:55 · 257 阅读 · 0 评论 -
优先队列 Fence Repair (PKU 3253)
准备切成的木板的长度为L1、L2、……、Ln. 未切割木板的长度恰好为切割木板的长度和。每次切断木板时,需要的开销为这块木板的长度。例如,长度为21的木板切割成5、8、8的三块木板。长为21的木板切割成13、8时,开销为21.再将长度为13的木板切割成长度5、8时,开销为13.于是合计开销为34。因为只需要从板的集合中取出最短的两块,并且把长度为两块长度之和的板加入集合中即可,所有使用优先队列就可以高效的实现。一共需要进行O(n)次O(log N)的操作,因此总的时间复杂度为O(Nlogn)。原创 2022-09-17 13:03:42 · 113 阅读 · 0 评论 -
优先队列 大根堆 Expedition (POJ 2431)
如果汽车在途中车上的汽油耗尽,卡车就无法继续前行,因而无法到达终点。第i个加油站在距离起点Ai单位距离的地方,最多可以给卡车加Bi单位的油。如果可以到达终点,输出最少加油次数,否则输出-1。分析:因为希望加油次数尽可能少,所以当燃料为0了之后再加油是最好的选择。基于贪心的思想,当燃料为0时,选择能加油量最大的加油站。所以可以用一个优先队列来保存经过的加油站的油量,当需要加油时,取出队列中的最大元素即可。输入格式:输入 N ,L, P的值,再输入N个加油站距离,再输入N个加油站的油量。原创 2022-09-15 18:44:31 · 141 阅读 · 0 评论 -
树的邻接表存储法
树可以使用链式存储结构,也可以使用邻接矩阵和邻接表一、邻接矩阵:我们可以使用一个n×n的bool数组mp,mp[x][y]为true,则表示从x到y存在有向边,为false则表示x到y不存在有向边。邻接矩阵存储代码如下:bool mp[MAXN][MAXN];void link(int x,int y){mp[x][y]=true;}二、邻接表同样,我们可以采用邻接表来存储一个点连出的多条树边,如下图:邻接表的代码如下:int m;int fi[MAXN];//存储结点儿子个数原创 2022-09-09 19:07:36 · 3309 阅读 · 0 评论 -
中缀、前缀和后缀表达式
逆波兰表达式先说一下中缀表达式,平时我们使用的运算表达式就是中缀表达式,例如1+3*2,中缀表达式的特点就是:二元运算符总是置于与之相关的两个运算对象之间人读起来比较好理解,但是计算机处理起来就很麻烦,运算顺序往往因表达式的内容而定,不具规律性。后缀表达式(又称逆波兰表达式),后缀表达式的特点就是:每一运算符都置于其运算对象之后,以上面的中缀表达式1+23为例子,转为后缀表达式就是123+下面先分析怎么把中缀表达式转换为后缀表达式,这里我们考虑六种操作符’+’、’-’、’*’、’/’、’(’、’)’原创 2020-10-08 17:58:09 · 3409 阅读 · 0 评论 -
区间最值差模板代码(RMQ)
题目描述:在每天挤奶的时候,农民约翰的N头牛(1≤n≤50000)总是排成一列。有一天,约翰决定与他的牛们一起玩一个极限飞盘游戏。为了简单起见,他将从奶牛队列里面选一定范围内的奶牛来玩这个游戏。然而所有的牛对这个游戏都很感兴趣。农民约翰列出了Q份名单(1≤Q≤200000)和每个奶牛的高度(1≤高度≤1000000)。对于每一份名单,他想你帮助他确定在每份名单中高度最高的奶牛与高度最低的奶牛的高度差是多少。Input第一行为N(1≤N≤50000)和Q(1≤Q≤200000);从第2行到第N+1行,每原创 2021-07-25 12:09:13 · 174 阅读 · 0 评论 -
开车旅行NOIP2002原题
原创 2020-12-03 16:50:03 · 132 阅读 · 0 评论 -
平衡树(STL set)
C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作。vector封装数组,list封装了链表,map和set封装了二叉树等,在封装这些数据结构的时候,STL按照程序员的使用习惯,以成员函数方式提供的常用操作,如:插入、排序、删除、查找等。让用户在STL使用过程中,并不会感到陌生。关于set,必须说明的是set关联式容器。set作为一个容器也是用来存储同一数据类型的数据类原创 2020-10-16 11:39:34 · 1615 阅读 · 0 评论 -
邻值查找CH1301(平衡树)
给定一个长度为 n 的序列 A,A 中的数各不相同。对于 A 中的每一个数 A i ,求:m i n ( 1 ≤ j < i ) ∣ A i − A j ∣,以及令上式取到最小值的 j(记为 P i )。若最小值点不唯一,则选择使 A j 较小的那个。数据范围:n<=105 ,|Ai|<=109题解:可以借助set来实现,set的查找是O(log n)的,最终的时间复杂度大约为O(n log n)#include<iostream>#include<cs原创 2020-10-16 11:02:08 · 421 阅读 · 0 评论 -
邻接表图文详解
在与链表相关的诸多结构中,邻接表是相当重要的一个。它是树与图结构的一般化存储方式, 邻接表可以看成“带有索引数组的多个数据链表”构成的结构集合。在这样的结构中存储的数据被分成若干类,每一类的数据构成一个链表。每一类还有一个代表元素,称为该类对应链表的“表头”。所有“表头”构成一个表头数组,作为一个可以随机访问的索引,从而可以通过表头数组定位到某一类数据对应的链表。为了方便起见,本书将这类结构统称为“邻接表”结构。如下图左侧所示,这是一个存储了6个数据节点v1~v6的邻接表结构。这6个数据节点被分成4类,原创 2020-06-19 13:46:45 · 10699 阅读 · 2 评论 -
Treap的更多操作和技巧
查找、插入、删除是平衡树最基本的三种操作,但是在实际的应用中许多其他的操作都是必要的,而且Treap这种强大的数据结构的功能远远不止此,下面我们要讨论的是Treapp更多的操作,以及一些技巧。Treap插入和删除操作参考前面博文treap(tree+heap就是二叉搜索树+堆)查找最值在BST的删除中,我们需要通过找待删除节点的后继(或前驱),也就是其右子树的最大值(左子树的最小值)在平......原创 2020-03-04 21:01:56 · 858 阅读 · 0 评论 -
c++函数传递的三种方式(平衡树调整左旋、右旋函数用到知识点)
在平衡树左旋,右旋函数中,我们使用了引用传递的方式,在这里补充一下函数的三种传递方式:1、按值传递(pass by value)2、地址传递(pass by pointer)3、引用传递(pass by reference)1、按值传递的过程为:首先计算出实参表达式的值,接着给对应的形参变量分配一个存储空间,该空间的大小等于该形参类型的,然后把以求出的实参表达式的值一一存入到形参变量分配的...原创 2020-03-04 16:16:03 · 224 阅读 · 0 评论 -
treap(tree+heap就是二叉搜索树+堆)
1、Treap的定义Treap是一棵二叉搜索树,只是每个节点多了一个优先级fix,对于每个节点,该节点的优先级小于等于其所有孩子的优先级。当然,引入优先级fix的目的就是防止退化成一条链,从而影响查找效率。所以,这样看来就是:Treap中对于节点的关键字key来说,它是一棵二叉搜索树,而对于fix来说,它是一个最小堆,所以Treap可以看成是Tree+Heap,只是这里的Heap不一定是完全二......原创 2020-02-23 15:18:33 · 675 阅读 · 0 评论 -
BST二叉搜索树
二叉树:是一种特殊的树,二叉树的每个节点最多只能有2个子节点。如果我们给二叉树加一个额外的条件,就可以得到一种被称作二叉搜索树(binary search tree)的特殊二叉树。二叉搜索树要求:1.左子树上的所有节点值均小于根节点值2右子树上的所有节点值均不小于根节点值3左右子树也满足上述两个条件二叉搜索树通常有搜索,插入,删除,寻找最大最小节点等操作。搜索:在搜索元素x的时候,我......原创 2020-02-21 10:47:31 · 330 阅读 · 0 评论 -
[NOIP2010初赛]烽火传递--单调队列优化
问题描述: 烽火台又称烽燧,是重要的军事防御设施,一般建在险要或交通要道上。一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息;夜晚燃烧干柴,以火光传递军情,在某两座城市之间有n个烽火台,每个烽火台发出信号都有一定代价。为了使情报准确地传递,在连续m个烽火台中至少要有一个发出信号。请计算总共最少花费多少代价,才能使敌军来袭之时,情报能在这两座城市之间准确传递。输入: 第一行...原创 2020-02-20 22:34:36 · 434 阅读 · 0 评论 -
单调栈模板
定义:栈内元素单调递增或者单调递减的栈,单调栈只能在栈顶操作。应用:单调栈解决的是以某个值为最小(最大)值的最大区间,实现方法是:求最小值(最大值)的最大区间,维护一个递增(递减)的栈,当遇到一个比栈顶小的值的时候开始弹栈,弹栈停止的位置到这个值的区间即为此值左边的最大区间;同时,当一个值被弹掉的时候也就意味着比它更小(更大)的值来了,也可以计算被弹掉的值得右边的最大区间。注:单调栈是维护某...原创 2020-02-20 22:31:00 · 473 阅读 · 0 评论 -
单调队列模板
单调队列我们从最简单的问题开始:eg. 现在有一个数列{An},假设它有n项,问题是:求出每个区间长度为k的连续区间内数列的最大值。数学表达式: f(i) = max{a(i-k+1),a(i-k+2),…, a(i)},i = 0,1,…,N-1。解法一:很直观的一种解法,那就是从数列的开头,将窗放上去,然后找到这最开始的k个数的最大值,然后窗最后移一个单元,继续找到k个数中的最大值...原创 2020-02-20 22:12:40 · 430 阅读 · 0 评论