随笔分类 - 算法竞赛-数据结构
摘要:题意:初始状态的栈内包含一个空集,对栈进行一下操作: PUSH:向栈内压入一个空集 DUP:复制栈顶,并压入栈内 UNION:将栈顶端两个集合出栈,并将两个元素的并集入栈 INTERSECT:将栈顶端两个集合出栈,并将两个元素的交集入栈 ADD:将栈顶端两个集合出栈,将先出栈元素加入后出栈元素的集合
阅读全文
摘要:若一个数在一段区间内作为最大值存在,那么答案应该加上这个数 若一个数在一段区间内作为最小值存在,那么答案应该减去这个数 所以我们利用单调栈,高效求出a[i]在哪个区间内作为最大/最小值存在,从而确定,加/减多少次a[i],最终得到答案 #include<stdio.h> #include<math.
阅读全文
摘要:利用单调栈,高效求出每个区间内的最大值和次大值的亦或值。 先正向扫描,利用单调递减栈,若当前栈为空栈,则直接压入栈中,若为非空栈,弹出栈顶元素,每弹出一个元素,则求一次亦或值,保留最大值 接着进行反向扫描,过程与上相似。 #include<stdio.h> #include<math.h> #inc
阅读全文
摘要:利用单调栈高效的求出,一个数a[i]在哪个区间内可作为最小值存在。 正向扫描,求出a[i]可做为最小值的区间的左边界 反向扫描,求出a[i]可作为最小值的区间的右边界 r[i] - l[i] +1 就是a[i]可作为最小值的区间的 最大长度 我们知道:长度为len的区间,包含长度为len-1的区间
阅读全文
摘要:分治 #include<stdio.h> #include<math.h> #include<cstring> #include<stack> #include<iostream> #include<algorithm> #include<queue> #define MAXSIZE 100005
阅读全文
摘要:题意:一辆汽车由起点开往小镇,总路程为L,路上有N个加油站,第i个加油站距离小镇a[i],最多可为提供b[i]的汽油,汽车开始时有P单位汽油,问汽车内否到达小镇,若能到达输出最小的加油次数。 思路:每经过一个加油站i,汽车就获得了一次在任何时候加油b[i]的权利,当汽车不足以到达下一站时,就加入过往
阅读全文
摘要:题意:将一块木板切成N块,长度分别为:a1,a2,……an,每次切割木板的开销为当前木板的长度。求出按照要求将木板切割完毕后的最小开销。 思路:比较奇特的贪心 每次切割都会将当前木板一分为二,可以按切割要求画出二叉树。 总开销 = 各叶子节点的值 x 该叶子节点的深度 树的深度一定,为了使总开销尽可
阅读全文
摘要:当我们需要高效的完成以下操作时: 1.插入一个元素 2.取得最小(最大)的数值,并且删除 能够完成这种操作的数据结构叫做优先队列 而能够使用二叉树,完成这种操作的数据结构叫做堆(二叉堆) 堆与优先队列的时间复杂度: 若共有n个元素,则可在O(logn)的时间内完成上述两种操作 堆的结构如下图: 堆最
阅读全文
摘要:优先队列:顾名思义,首先它是一个队列,但是它强调了“优先”二字,所以,已经不能算是一般意义上的队列了,它的“优先”意指取队首元素时,有一定的选择性,即根据元素的属性选择某一项值最优的出队~
阅读全文
摘要:#include<iostream>#include<algorithm>#include<cstring>#include<vector>#include<stdio.h>#include<stdlib.h>#include<queue>#include<math.h>#include<map>#
阅读全文
摘要:#include<iostream>#include<algorithm>#include<cstring>#include<vector>#include<stdio.h>#include<stdlib.h>#include<queue>#include<math.h>#include<map>#
阅读全文
摘要:题目大意:托尔有一部手机可执行三种操作 1.x APP产生一个新消息 2.读取x App已产生的所有消息 3.读取前t个产生的消息 问每次操作后未读取的消息的数量 题目思路: 队列模拟,坑点在于竟然卡内存……详细看代码。 #include<iostream> #include<algorithm>
阅读全文
摘要:/*以头插法,创建长度为n的单链表,并实现对其的增、删、改、查*/
阅读全文
摘要:根据图解和一组数据简单解释如何在建立正邻接表和逆邻接表
阅读全文