随笔分类 - 数据结构——栈&队列&二叉堆
摘要:DP模型 形如$f(i)=\max \{f(j)+w(i,j)\}\quad(1\le j
阅读全文
摘要:Description "【SCOI2010】股票交易" 在T天时间内,第$i$天股票购入价为$ap_i$,出售价为$bp_i$,每天最多购入$as_i$股,最多出售$bs_i$股 任意时刻手中的股票数不能超过$Maxp$,且两次交易至少间隔$W$天 最大化收益,初始资金视为无限大 Solution
阅读全文
摘要:Description 【洛谷P2034】选择数字 给定一个序列,选择其中若干个数,但不能有超过k个连续的数字被选择。最大化选出的数字之和。 Solution dp+单调队列 正难则反,考虑从序列中取出一些数,这些数两两之间的距离不超过k,最小化之和 那么定义$f[i]$表示前i个数,取出一些的最小
阅读全文
摘要:Description 维护一个数列的如下操作: 在某个位置后插入一段数列 在某个位置后删除一段数列 将连续的一段数列修改为某个值 将一段数列翻转 求一段数列的和 求整个数列的最大子段和 Solution 魔鬼Splay题 用Splay维护序列,以下标为权值建树。 如果插入一段序列,我们就将这段序列
阅读全文
摘要:Description 给定一个01矩阵,求出最大的正方形子矩阵和最大长方形子矩阵,并保证取出的矩阵中的元素都为0/1 Solution 为了使题目变成上述表述的形式,我们首先将读入的矩阵的部分元素xor1,使其变成一般形式 之后,这道题变成了两道题的合体:洛谷P2701巨大的牛棚与P4147玉蟾宫
阅读全文
摘要:一道关于优先队列的搜索题。 我们建立一个小根堆,将开始确定的值放进去,然后进行bfs。 对于每个点,向上下左右四个方向扩展,并且更新答案,同时将没入队的节点入队即可。 最后,我们得到了一个搜索完成的图,我们判断一下合法性,输出答案即可。 这道题有一个坑点:输入可能重复同一节点但权值不同,这种情况应当
阅读全文
摘要:模板来源:codevs 5429 根据背包问题的相关状态转移方程,我们不难写出朴素的算法 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace s
阅读全文
摘要:本人是NOIP2017的亲历者,两年前这道题我在考场上随便打了个二分暴力,就草草结束了 如今在做这道题,便能简单的AC了 我采用的思路是二分答案,然后用dp判断答案的可行性。定义f[i]表示到i这个格子最大的分数,如果为一个极小值则可以认为这个点无法到达;x[i]表示i的位置,g表示当前二分的答案。
阅读全文
摘要:单调队列优化dp 我们将每个人的s值排序,这样我们就能保证当前这个人刷的木板一定在上一个人之后,我们就能进行线型dp 定义f[i][j]表示前i个人刷前j个木板获得的最多报仇,那么有 在dp过程中,我们假定外层变量i为定值,当j增大时,不难发现k的取值范围上界不变,下界变大。我们不妨比较一下两个决策
阅读全文
摘要:动态维护中位数的题目。 我们采用对顶堆做法,建立一个大根堆存储前半段序列(排序后),小根堆存储后半段序列,通过维护两个堆使得他们元素个数之差不大于1 ,这样这个序列的中位数就是大根堆的堆顶。 关于如何维护对顶堆:如果两个堆元素个数差大于1,我们就把大根堆的堆顶放到小根堆当中(或是把小根堆堆顶放到大根
阅读全文
摘要:这道题可以用Splay、fhq-treap解决,但是平衡树解这道题大材小用,所以我采用了对顶堆解决。 考虑建立两个堆:以i为分割点,用大根堆存储前半段序列,用小根堆存储后半段序列。我们控制大根堆的元素个数为i,这样查询时大根堆的堆顶就是排名为i的元素。然后我们考虑维护对顶堆。 对于add操作,我们先
阅读全文
摘要:“二维”单调栈的题目,一上来有点没有思路,想用dp做一下,然而转念一想,假设我们把这个图按照行进行划分,先处理前1行的最大矩形,在处理前2行的最大矩形,再处理前3行的最大矩形……最后用子问题的答案更新答案即可。这样一来,这个问题就转化成了一个简化版单调栈的题目。 简化版点这里,所以,我们采用这种思路
阅读全文
摘要:一道关于单调队列的模板题。 题目要求求一段区间,使得这一段区间的和最大且区间长度不超过m。我们显然想到了先求出这个序列的前缀和sum,这样我们就能用O(1)的时间查询任意一个子序列的和。 现在,我们枚举区间的右端点,对于每一个右端点i,我们要找到一个左端点j,使得sum[j]最小而且i-j≤m. 因
阅读全文
摘要:这道题当然可以用线段树求解,但是有点大材小用。我的做法是对顶堆,用两个堆维护中位数。 建立一个大根堆,一个小根堆。大根堆存储前半部分序列,小根堆存储后半部分序列,在任意时刻,这个序列的中位数为大根堆的堆顶或者是小根堆的堆顶。 如果现在新加入了一个数x,判断x应该在大根堆还是小根堆中,即判断排序后x在
阅读全文
摘要:这是一道基础数据结构的综合题,思考量较大,但是实现简单。 我们考虑建立三个队列,分别存储原始长度、切开后第一段的长度、第二段长度。显然,这三个队列是非严格单调下降的,对于每个时刻,将要切开的蚯蚓即为三个队列队头的最大值。另外,我们用一个变量delta表示整个集合的偏移值,即队列中的长度+delta=
阅读全文
摘要:一道简单的括号匹配问题,如果是左括号就入栈,如果是右括号且与栈顶匹配则答案加2,如果不匹配则答案清零,每次都更新一下最优答案即可。 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std
阅读全文
摘要:一道单调栈的基础题,我们建立一个单调上升的栈,当一个矩形被扫描时,如果他的高度大于栈顶就直接入栈,否则就不断取出栈顶,直到栈空或者栈顶小于当前矩形,在出栈的同时,我们累计被弹出的矩形宽度之和,每次弹出一个矩形,我们就用他的高度乘累计的宽度更新答案,出栈结束后,我们把一个高度为当前高度,宽度为累计宽度
阅读全文
摘要:栈的入门题,主要考察了栈的基本操作,用递归模拟实现即可 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cstdlib> 6 using namespa
阅读全文