
数据结构
notmuch
这个作者很懒,什么都没留下…
展开
-
leetcode - problem 71 - 简化路径
很简单,用一个栈就可以完成。先对原字符串按照’/‘分割成列表。此时列表中可能会有空串“”,这是因为原字符串中的’/‘全部都替换成了空串加进列表里面。于是,第二部调用filter()函数过滤掉所有的空串。再迭代整个列表:1. 如果遇到’.’,保持栈中的元素不变,不进行操作;2. 如果遇到"…",弹出栈顶(如果有的话);3. 其他情况都将列表元素压进栈。因为我是用python的列表来表示一个栈stack,因此我这里的栈是一个可迭代的对象。最后简化后的路径就是: ‘/’ + “/”.join(stack)原创 2021-01-04 16:36:39 · 123 阅读 · 0 评论 -
堆排序
#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>using namespace std;void HeapAdjust(int a[],int s,int m) //堆“筛选”{ int temp=a[s]; for(int i=s<&...原创 2019-11-27 07:40:44 · 205 阅读 · 0 评论 -
牛客练习赛53,C(字典树+暴力)
想到了字典树求解,但是TLE了,后来分析发现当询问的字符串中"_"的个数一多的话,我这个算法很容易就超时。不过因为我觉得这个算法其实还是可以的,而且以前也有过这种情况,所以就分类讨论,当询问的字符串中的“1”或“0”的个数超过20个时,我就用字典树求解,否则我就暴力求解。结果是200MS过题。#include<cstdio>#include<iostream>#inc...原创 2019-10-11 23:00:44 · 145 阅读 · 0 评论 -
洛谷P1440 求m区间内的最小值(RMQ/笛卡尔树)
题意:一个含有n项的数列(n<=2000000),求出每一项前的m个数到它这个区间内的最小值。若前面的数不足m项则从第1个数开始,若前面没有数则输出0。RMQ代码如下:#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<c...原创 2019-08-24 10:24:18 · 415 阅读 · 0 评论 -
牛客,Keep In Line(单调栈)
开始几遍是用暴力打的,基本都TLE,后来寻思了一下,发现:正常情况下,入队顺序应为:1,2,3,4,5,…出队顺序也应为:1,2,3,4,5,…有什么发现?出入队都是一个严格单调递增序列。想到了什么?单调递增栈!题意是要求不插队的人数,那么我们可以用一个单调递增栈,维护出队顺序当中的一段最长单调递增序列,思考一下,可以发现该序列的长度就是我们要找的答案。代码如下:#include<...原创 2019-08-13 23:15:46 · 744 阅读 · 0 评论 -
UVALive 3882,And Then There Was One(数据结构+模拟题)
题意一看大概就知道是个模拟题,不过,如果暴力模拟的话会超时,所以还需要思考一下,怎么优雅的模拟。首先,每次实际走的步数其实是k%cnt,其中cnt是当前石子的数量。其次,因为中间会出现很多已经弃掉的石子,需要跳过这些,最简单的方法就是设置bool vis[n]数组,vis[i]=1,0分别表示已经弃掉和未弃掉,当我们扫描到石子i时,判断它是否已经弃掉了,是的话就跳过它。不过,挺遗憾的,这么做的话...原创 2019-08-06 12:42:43 · 126 阅读 · 0 评论 -
2019牛客暑期多校训练营(第三场),J(模拟题)
比赛的时候大概知道这是一道模拟题,但是想不到什么好的数据结构可以用,感觉容易超时,就没有去做。后来看了标程,原来可以用双向链表+map来做,其中map映射的值是双向链表中元素的指针!!!这样模拟起来就简单挺多的了。PS:STL中有链表list,但是本人不太会用,而且感觉使用起来也不会说很方便,所以就自己手写了一个简单的双向链表。代码如下:#include<cstdio>#inc...原创 2019-07-27 11:07:29 · 167 阅读 · 0 评论 -
2019牛客暑期多校训练营(第四场)A
题意:给定n个顶点,n-1条边权为1的边,将各个顶点连成一个最小生成树,再给定一个K,表示有多少个人,每个人都在特点的一个顶点上,现在这些人要相会,求使得这些人能够相聚在一起的最短时间。看了标程,答案就是K个人当中那2个距离最远的人的距离d,答案就是d/2向上取整。证明:必要性:K个人当中,最远的那2个人u,v要相遇,则其中一个必定至少要走⌈d/2⌉的步数。充分性:我们取最远那2个人u,v...原创 2019-08-01 00:35:57 · 181 阅读 · 0 评论 -
牛客练习赛4 A(单调栈)
分析:设置结构体lap{ int m,s; },设置结构体数组l[n],按m从大到小排序。接下来遍历l[n],并用一个单调递减栈去维护,详解见代码。#include<cstdio>#include<iostream>#include<algorithm>#include<stack>using namespace std;typedef...原创 2019-07-22 17:59:47 · 128 阅读 · 0 评论 -
POJ1330,Nearest Common Ancestors(LCA+RMQ/倍增/Tarjan)
LCA的裸题。LCA可以用三种方式求解,其中离线算法有Tarjan,在线算法有倍增,RMQ,个人觉得RMQ效率会高一点。有个博客讲解的很好,链接:https://blog.youkuaiyun.com/my_sunshine26/article/details/72717112这里我总结了一下三种方法的关键点:1.Tarjan求LCA核心:离线+DFS后序遍历+并查集1.开设vis[i], fa[...原创 2019-08-25 14:36:52 · 179 阅读 · 0 评论 -
洛谷P1351 联合权值(无根树转化为有根树)
先将所给的图(无根树)转化为有根树,可以用一遍DFS完成。转化为有根树后,对于i点,能够产生与它联合权值的点,要么是它第一个祖先(孙子),要么是与它层数相同的兄弟。i与它的祖先(孙子)产生的联合权值容易计算,可以在O(1)内完成,但是与它的兄弟的权值,用朴素的算法就需要O(n)了,例如i1,i2,i3的父节点都为k,那么i1,i2,i3之间总的联合权值就为:2 * ( w[i1] * w[i2]...原创 2019-08-28 18:43:01 · 211 阅读 · 0 评论 -
洛谷P1967 货车运输(倍增+LCA+生成树)
题意:有n座城市,m条道路,每条路有个限流w,有q次询问,询问x,y城市之间的一次性允许通过的最大流量是多少。题意不难理解,看起来也不难,可以用倍增+LCA解决,但是此题有个难点:x,y城市之间可能有多条道路,非但如此,题意给的图可能会有环。我们知道,要用LCA算法前提是图不能有环,如果只是有多条路而无环,我们还可对m条路排一次序,剔除掉那些多余的路径,这样就可以用LCA,但如果有环的话就行不通...原创 2019-08-30 12:36:11 · 191 阅读 · 0 评论 -
双向链表的基本操作
做了几道都需要用双向链表来模拟的题,因为STL中的链表感觉有点复杂,不太容易用,所以每次需要用的时候都要自己手写一遍。贴一贴代码,下次需要就可以用。#include<cstdio>#include<iostream>#include<cstring>#include<string>#include<algorithm>#inc...原创 2019-08-30 20:04:59 · 130 阅读 · 0 评论 -
POJ2838,Sliding Window(单调队列)
关于单调队列的讲解可看:https://blog.youkuaiyun.com/roufoo/article/details/78443281https://www.cnblogs.com/neverforget/archive/2011/10/13/ll.html (单调队列的应用)单调递增队列可以求滑动窗口的最小值(队首),单调递减队列可以求滑动窗口的最大值(队首)。PS:本人的代码中是用STL中...原创 2019-09-03 21:27:57 · 126 阅读 · 0 评论 -
洛谷P1638 逛画展(双向队列)
在算法标签中搜了单调队列,搜到了这道题,但实际做起来发现并不是个单调队列,只是个双向队列的应用罢了…朴素算法是暴力枚举,时间复杂度是O(n),用双向队列优化后可以降为O(n)。首先我们设置num[i],表示第i位画家的作品出现的次数,显然当num[1~m]都不为0时就可以看遍所以画家的作品,我们用sum记录当前还有多少位画家的作品还未出现,则当sum=0时就可以更新[a,b]区间。接下来就是...原创 2019-09-07 00:10:59 · 279 阅读 · 0 评论 -
洛谷P1714 切蛋糕(单调队列优化DP)
题意很清晰,就不多讲了。我们不难想到可以用DP来做:dp[i]表示以第i块蛋糕为结尾时,所能获得的最大幸运值。记sum[i]为1~i块蛋糕的幸运值的总和。则状态转移方程:dp[i]=sum[i]-min(sum[j]), i-m<=j<=i。当j==i的时候,表示一块蛋糕也不吃,这种情况是允许的。于是,我们只要在[i-m,i]之中找到最小sum值,就可以完成状态转移。朴素算...原创 2019-09-09 11:27:59 · 310 阅读 · 0 评论 -
洛谷P1725 琪露诺(单调队列优化DP)
题意:输入n,l,r,有a[n+1]个数,a[0]=0,一开始你的位置在0,要往前跳,每次只能跳到[i+l,i+r]区间内的位置,跳到k位置就会得到价值a[k],你的任务就是从0开始跳直到你的位置超过位置n,且所得的价值最大。可以用DP来做。dp[i]表示跳到i位置时所能获得的最大价值。显然dp[i]=max(dp[k])+a[i], i-r<=k<=i-l。于是我们可以用一个...原创 2019-09-10 19:10:41 · 287 阅读 · 0 评论 -
2019牛客暑期多校训练营(第二场),H
单调栈可以求出最大矩形面积,这里稍作变形即可解决。设s[i][j]为原图,h[i][j]为以s[i][j]为底的矩形的最大高度。记录下每个h[i][j],然后逐行求最大矩形面积即可。不过这里最终要输出的是第二大矩形的面积(可以重叠的,比赛时想太复杂了,以为不可以重叠。。。),所以在更新的时候要有一些变化(见代码)。#include<cstdio>#include<iost...原创 2019-07-22 10:19:16 · 210 阅读 · 0 评论 -
牛客,小A的柱状图(单调栈)
小白初次遇到单调栈,题解参考于:https://blog.youkuaiyun.com/qq_41608020/article/details/89294830重点:高度小的矩形整一个都可以与高度大的矩形的一部分合并,而高度大的矩形不能够整个与高度小的矩形合并。#include<cstdio>#include<iostream>#include<algorithm>...原创 2019-07-21 21:21:14 · 170 阅读 · 0 评论 -
队列(数据结构)
自己尝试写了一个队列。采用递归定义。#include<cstdio>#include<algorithm>#include<cstdlib>#include<iostream>using namespace std;struct stack{ int v; //队列元素存储的值 stack *next; //队列下一个元...原创 2019-04-20 18:21:54 · 161 阅读 · 0 评论 -
2019年湘潭大学程序设计竞赛(重现赛)——F,Black & White(数据结构)
原本的思路是就是枚举,但一直不敢动,因为硬肝应该会超时,而且代码也比较难打,但想来想去又没什么法子。后来去看了同校的大佬的代码,才发现可以用队列来维护,这样不仅容易打代码,而且时间复杂度也变成了2*n。代码如下:#include<iostream>#include<cstring>#include<cmath>#include<queue>...原创 2019-05-10 23:29:23 · 216 阅读 · 0 评论 -
UVa1594,Ducii序列(队列)
用两个队列q1,q2来模拟操作过程。输入n个数字,q1,q2的区别是,q1一开始就开始将数字入队,而q2是从第二个数字开始入队,最后队尾再加入第一个数字,后续模拟过程亦是如此。代码如下:#include<cstdio>#include<iostream>#include<queue>#include<cmath> #include<...原创 2019-05-21 17:03:15 · 282 阅读 · 0 评论 -
UVa10935,卡片游戏(数据结构)
用队列模拟就好了代码如下:#include<cstdio>#include<iostream>#include<queue>#include<cmath> #include<algorithm>using namespace std;queue<int> q;int n;void print(){ pr...原创 2019-05-21 19:35:49 · 152 阅读 · 0 评论 -
HDU1896,Stones(STL)
用优先队列模拟就行了,只不过题意要理解好:当奇数次遇到石子时就丢石子,否则就弃石子。个人觉得题意描述得挺模糊的,容易让人石子的编号是奇数时丢石子。代码如下:#include<iostream>#include<queue>using namespace std;typedef long long ll;struct stone{ int p,d; bool...原创 2019-05-27 20:21:19 · 154 阅读 · 0 评论 -
HDU1166,敌兵布阵(树状数组)
树状数组的模板题。树状数组是一个查询和更新复杂度都为log(n)的数据结构。主要用于数组的单点修改&&区间求和。关于树状数组的详解,可看下面的博客:https://blog.youkuaiyun.com/bestsort/article/details/80796531#区间修改-单点查询核心是在lowbit函数上。此题为树状数组的单点更新与区间求和问题。代码如下:#includ...原创 2019-05-23 16:25:08 · 106 阅读 · 0 评论 -
HDU1022,Train Problem I(栈)
明显要用栈来模拟。突破口:找栈顶解析将在代码中体现。#include<stack>#include<vector>#include<string>#include<cstring>#include<iostream>using namespace std;stack<char> p;vector<st...原创 2019-05-28 11:31:56 · 118 阅读 · 0 评论 -
POJ2833,The Average(优先队列)
突破口:开两个优先队列q_ma,q_mi,前者维护前n1个最大的数,后者维护后n2个最小的数。原本打算用一个优先队列存储数据,但是如果全部都存的话会爆内存,而且还可能会超时,然后就想能不能用一个优先队列来存n-(n1+n2)个数就好(因为最终有效的数据个数就只有n-(n1+n2)个),这样就不会爆内存而且也省时,然而,发现这样存的话,当队列的大小达到n-(n1+n2)时,接下来没法判断下一个元素...原创 2019-05-30 21:21:57 · 242 阅读 · 0 评论 -
POJ3125,Printer Queue(队列)
根据题目需求,用队列进行模拟就好了。代码如下:#include<queue>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;struct task{ int val,id;};int...原创 2019-05-24 09:44:06 · 173 阅读 · 0 评论 -
二叉排序树(数据结构)
#include<cstdio>#include<iostream>#include<cstring>using namespace std;struct BinaryTree{ int data; BinaryTree *left,*right; BinaryTree() { data=-1; left=right=NULL; }...原创 2019-06-01 16:27:26 · 1280 阅读 · 0 评论 -
POJ3159,Candies(Dijkstra+链式前向星)
做这道题的时候Dijkstra的松弛方式搞错了,一直WA。。。令x-y<=z表示x最大比y大z。若b-a<=k1, c-b<=k2, c-a<=k3,那么c-a最大为多少呢?显然应该等于min(k1+k2, k3)。可以用下图来表示示(不擅图丑勿怪)上述引自:https://blog.youkuaiyun.com/to_be_better/article/details/50...原创 2019-06-21 20:41:07 · 182 阅读 · 0 评论 -
2019牛客暑期多校训练营(第一场),A题(笛卡尔树)
题意转换过来之后大概就是建立两个数组a[n].b[n]的笛卡尔树,并求出这两棵笛卡尔树从key=1开始能够同构的最大子树。代码如下:#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<...原创 2019-07-19 19:41:17 · 336 阅读 · 0 评论 -
笛卡尔树模板
笛卡尔树是一种特定的二叉树数据结构,可由数列构造,在范围最值查询、范围top k查询(range top k queries)等问题上有广泛应用。它具有堆的有序性,中序遍历可以输出原数列。 //引自百度百科关于笛卡尔树的构造,可参考:https://www.cnblogs.com/CaptainSlow/p/9282507.html动态构造版本:#include<cstdio>...原创 2019-07-19 19:46:20 · 157 阅读 · 0 评论 -
笛卡尔树区间查询最值
#include<cstdio>#include<iostream>#include<algorithm>#include<cmath>#include<cstring>#include<stack>using namespace std;int a[105],n;int fa[105],ls[105],rs[...原创 2019-07-19 20:44:58 · 509 阅读 · 0 评论 -
堆栈(数据结构)
自己尝试写了个堆栈。#include<cstdio>#include<algorithm>#include<cstdlib>#include<iostream>using namespace std;struct stack{ int v; //栈存储的值 stack *front; //指向前一个栈...原创 2019-04-20 18:07:37 · 554 阅读 · 0 评论