![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
单调栈/单调队列
文章平均质量分 72
Frozen_Guardian
已退役菜鸡Acmer
展开
-
HDU多校4 - 6989 Didn‘t I Say to Make My Abilities Average in the Next Life?!(单调栈)
题目链接:点击查看题目大意:给出一个长度为 nnn 的序列,再给出 mmm 次询问,每次询问给出一个区间 [l,r][l,r][l,r],要求输出区间 [l,r][l,r][l,r] 内 “平均值” 的期望。区间 [l,r][l,r][l,r] 的 “平均值”,是等概率的选择一个子区间 [L,R][L,R][L,R],满足 l≤L≤R≤rl\le L\le R \le rl≤L≤R≤r,“平均值” = ([L,R][L,R][L,R]内的最大值+[L,R][L,R][L,R]内的最小值)/2题目分析:对原创 2021-08-01 21:39:04 · 242 阅读 · 0 评论 -
洛谷 - P3246 [HNOI2016]序列(莫队+单调栈)
题目链接:点击查看题目大意:给出一个长度为 nnn 的序列,再给出 mmm 次询问,每次询问需要回答一个区间 [l,r][l,r][l,r] 内的最小值之和题目分析:因为可以离线,所以考虑莫队,这个题的难点是如何处理 [L,R][L,R][L,R] 递推到 [L,R+1][L,R+1][L,R+1]从 [L,R][L,R][L,R] 推到 [L,R+1][L,R+1][L,R+1],实质上多了 R−L+2R-L+2R−L+2 个子区间,分别是 [L,R+1],[L+1,R+1],...,[R+1,R+原创 2021-08-01 14:03:46 · 369 阅读 · 0 评论 -
CodeForces - 817D Imbalanced Array(单调栈)
题目链接:点击查看题目大意:给出一个长度为 nnn 的序列,求出所有子区间的最大值与最小值之差的和题目分析:不难看出最大值和最小值之差的和可以拆开,拆成最大值之和与最小值之和之差,现在问题转换为如何求解所有子区间内的最值之和可以单调栈维护每个数字的可行范围,这里以最小值为例,当我们遍历到 iii 位置时,我们只需要求出左侧首次小于 a[i]a[i]a[i] 的位置 lll,以及右侧首次小于 a[i]a[i]a[i] 的位置 rrr,那么 a[i]a[i]a[i] 的贡献就是:左端点属于区间 [l,i]原创 2021-07-31 21:49:27 · 255 阅读 · 0 评论 -
LibreOJ - 3083 与或和(单调栈+位运算)
题目链接:点击查看题目大意:给出一个 n∗mn*mn∗m 的矩阵,要求所有子矩阵的“按位与和”和“按位或和”题目分析:通过样例一的提示,不难想到拆位之后原矩阵会变成 010101 矩阵。对于“按位与”来说,一个子矩阵有贡献当且仅当子矩阵中全为 111 ,而同理,对于“按位或”来说,一个子矩阵没贡献当且仅当子矩阵中全为 000。所以我们的问题转换为了,如何求解 010101 矩阵中,全 000 或全 111 子矩阵的个数去年遇到的一个模型,放到今年就不会了,反向训练第一人:牛客 - Animal Pro原创 2021-07-30 19:43:30 · 137 阅读 · 0 评论 -
2021牛客多校2 - Stack(单调栈+拓扑)
题目链接:点击查看题目大意:给出 b[i]b[i]b[i] 数组的求解过程:Stk is an empty stackfor i = 1 to n : while ( Stk is not empty ) and ( Stk's top > a[i] ) : pop Stk push a[i] b[i]=Stk's size现在给出 bbb 数组的 kkk 个位置,要求构造出一组合法的数组 aaa 作为答案题目分析:任意解感觉没有什么可扩展性,所以原创 2021-07-21 11:56:40 · 411 阅读 · 0 评论 -
牛客 - 牛牛的滑动窗口(单调栈+思维+差分)
题目链接:点击查看题目分析:给出 nnn 个数,定义滑动窗口的贡献是其中最大值与最小值的乘积,现在问对于长度分别为 [1,n][1,n][1,n] 的滑动窗口,贡献之和分别是多少题目分析:考虑暴力解法,是直接 RMQRMQRMQ 预处理一下,然后 O(n2)O(n^2)O(n2) 去模拟整个过程正难则反,考虑正这去枚举区间不行,那么我们是否可以通过枚举每个数字,从而计算每个数字对区间的贡献呢根据滑动窗口的定义,不难发现在每个长度下的滑动窗口,对于每个位置来说,都有可能作为一次窗口的起点或终点(如果越原创 2021-06-01 15:10:45 · 463 阅读 · 3 评论 -
CodeForces - 1484E Skyline Photo(dp+单调栈)
题目链接:点击查看题目大意:给出 nnn 个建筑,每个建筑有一个高度和一个美丽值,现在要求划分为数个连续的区间,使得所有区间的贡献之和最大,其中每个区间的贡献值为,区间中高度最低的建筑物的美丽值题目分析:不难分析出一个很简单的经典区间划分 dpdpdp,时间复杂度是 O(n2)O(n^2)O(n2) 的:dpi=max(dpj+val(j+1,i))dp_i=max(dp_j+val(j+1,i))dpi=max(dpj+val(j+1,i)),其中 j∈[0,i−1]j\in[0,i-1]j∈[原创 2021-05-24 16:06:15 · 290 阅读 · 0 评论 -
CodeForces - 1506G Maximize the Remaining String(单调栈+贪心)
题目链接:点击查看题目大意:给出一个长度为 nnn 的字符串,假设共出现了 kkk 种字母,现在要求出一个长度为 kkk 的子序列,满足每种字母只出现一次,且字典序最大题目分析:和之前牛客上的一道题目模型一样,都是借助单调栈实现的贪心,考虑用单调栈维护答案序列,现在新加入了一个字母 chchch,分情况讨论:chchch 在答案序列中已经出现过,跳过即可chchch 比栈顶元素的字典序要大,且栈顶元素在后面还有出现:则用 chchch 将栈顶元素挤下去一定是最优的模拟整个过程,最后将栈中的答案原创 2021-05-23 16:17:27 · 184 阅读 · 0 评论 -
CodeForces - 1407D Discrete Centrifugal Jumps(单调栈+dp)
题目链接:点击查看题目大意:给出 n 个大楼的高度记为 h,现在需要从第一个大楼到达第 n 个大楼,问最小步数是多少,只有满足以下条件时才能从 i 移动到 j ,设 i < j: 题目分析:无后效性的最优解,显然是 dp 问题,但又不好直接进行转移,所以需要借助数据结构来维护首先第一种情况的状态不用多说了,直接转移就好,对于后两种情况,假设从状态 dp[ i ] 转移到 dp[ j] ,对于每个接受状态的 j 来说,需要找到一个 i ,满足其之间的数都要小于 h[ i ] 和 h.原创 2020-09-09 12:44:02 · 1791 阅读 · 2 评论 -
牛客 - sequence(笛卡尔树+线段树)
题目链接:点击查看题目大意:给出一个长度为 n 的数列 a 和数列 b ,求题目分析:不算难的题目,对于每个 a[ i ] 求一下贡献然后维护最大值就好,具体思路就是,先找出每个 a[ i ] 左右两侧分别小于 a[ i ] 的位置,分别记为 l 和 r,再对数列 b 维护一下前缀和 sum,比较显然的就是 ( l , r ) 这段区间内,凡是跨过位置 i 的区间最小值一定是 a[ i ],然后分类讨论一下:如果 a[ i ] > 0:在 [ l - 1 , i - 1 ] 中找到 sum原创 2020-08-22 17:07:17 · 282 阅读 · 0 评论 -
POJ - 2559 Largest Rectangle in a Histogram(笛卡尔树,单调栈实现)
题目链接:点击查看题目大意:给出一排高度不同,宽度都为 1 的矩形,问拼起来后最大的矩形面积是多少题目分析:普通做法是用单调栈直接维护,我一直觉得单调栈处理这种矩形问题都比较抽象,也可能是我太菜了,这个题目恰好发现可以用笛卡尔树实现,拿来练练手,根据笛卡尔树的性质,对于每个矩形,以出现的下标为 key ,高度为 val ,维护一个小顶堆的笛卡尔树,那么对于树上每个节点的 val 乘以子树的大小就是当前节点可以做出的贡献,维护一下最大值就是答案了为了防止特殊情况的出现,可以预处理在单调栈中加入一个原创 2020-08-22 11:58:05 · 237 阅读 · 0 评论 -
HDU多校1 - 6759 Leading Robots(单调栈)
题目链接:点击查看题目大意:n 个机器人在数轴上赛跑,给出每个机器人的起点和加速度,初始速度都为 0 ,问有多少个机器人在赛跑的过程中可以成为最前面的一个题目分析:又是被zx学长秒掉的一道题,感谢zx学长的耐心讲解首先根据高中物理知识,根据已知条件,可以得到位移与时间的方程,y 代表位移,x 代表时间,b 代表初始位置,k 代表加速度因为都是抛物线,求交点非常的麻烦,因为我们只需要求交点的相对位置,所以可以将方程转换为位移与时间的平方的方程:,这样并不会影响交点的相对位置,同时将每一个位移.原创 2020-07-23 02:31:59 · 375 阅读 · 0 评论 -
牛客多校2 - Fake Maxpooling(线性递推gcd+单调队列)
题目链接:点击查看题目大意:给出一个矩阵 A 的大小,规定其元素 A[ i ][ j ] = lcm( i , j ) ,再给出一个 k ,求所有大小为 k * k 的子矩阵中的最大值之和题目分析:题目时限给了三秒,可以直接 n * m * logn 去求出矩阵 A ,但题解提供了一种可以线性求解 gcd 的方法,所以可以优化掉一层 log,在求出矩阵 A 后,可以对于每一行,利用单调队列维护区间最大值,mmax[ i ][ j ] 记录 A[ i ][ j - k ] : A[ i ][ j ]原创 2020-07-14 01:29:11 · 612 阅读 · 0 评论 -
牛客 - Animal Protection(单调栈)
题目链接:点击查看题目大意:给出一个 n * m 的矩阵,只由 O 和 X 组成,现在问一共有多少个只由 O 组成的矩形题目分析:之前复现赛做过一个类似思想的题目,核心都是在矩阵中的每一行或者每一列使用单调栈维护连续的 O ,然后计算贡献自己动手画画不难看出,一个 a* b的全是 O 的矩形中,固定右上角后,可以找到 a * b 个不同的满足题意的矩阵,换句话说,我们可以枚举右上角然后计算贡献(同理枚举矩形的任意一个角都是可以的)对于这个题目而言,我们可以对于每一行维护一个向下的单调栈,..原创 2020-06-17 00:23:20 · 373 阅读 · 0 评论 -
联想杯 - Gentle Jena(单调栈)
Problem G. Gentle Jena Input file: Standard Input Time limit: 2 seconds Output file: Standard Output Memory limit: 512 megabytes ... Why don’t you come to the planetarium? The beautiful twinkling of eternity that will never fade, no matter wh原创 2020-06-01 13:59:50 · 436 阅读 · 0 评论 -
CodeForces - 1313C2 Skyscrapers (hard version)(单调栈+dp/分治)
题目链接:点击查看题目大意:给出 n 块连续的空地可以建造摩天大楼,政府有规定,每块地最高只能建 a[ i ] 的高度,同时每栋大楼需要满足一个规则,即每栋大楼的两侧不允许同时存在比自己高的大楼,输出一种方案,使得总高度之和最大题目分析:C1题目的数据范围是 1e3 ,直接两层 for 暴力枚举每个位置作为最高点就可以了,没有难度的暴力就不多说了,直接说一下C2题目的 5e5 该如何处理吧...原创 2020-02-24 00:11:02 · 1547 阅读 · 3 评论 -
CodeForces - 548D Mike and Feet(单调栈)
题目链接:点击查看题目大意:给出一个长度为 n 的数列,现在规定对于任意长度区间为 len 的答案为,所以长度为 len 的区间内的最小值的最大值,题目要求我们输出len为 1 ~ n 时的答案题目分析:看似很复杂,其实我们只需要维护每个区间内的最小值就好了,并且顺便维护一下区间长度,如果暴力枚举每个区间显然是不行的,我们可以利用单调栈,求出每个数字左边和右边第一个比他小的数字的位置,那么...原创 2020-02-03 17:35:21 · 266 阅读 · 0 评论 -
POJ - 3415 Common Substrings(后缀数组+单调栈)
题目链接:点击查看题目大意:给出两个字符串,再给出一个k,问两个字符串中长度大于等于k的公共子串有多少个(种类可重复)题目分析:因为涉及到了子串问题,先用后缀数组跑出height数组来,接下来如果直接枚举两个字符串每一个位置的height来统计答案的话,时间复杂度是n*n,还是不能在规定时间内完成,当然这里提一嘴n*n的做法,可以先nlogn预处理出任意两个后缀的height的值,然后直接...原创 2020-01-18 17:16:57 · 186 阅读 · 0 评论 -
2019ICPC(银川) - Largest Common Submatrix(单调栈)
题目链接:点击查看题目大意:给出两个n*m的矩阵,问最大的公共子矩阵的面积是多少题目分析:一开始看到这个题目是想到了一个n^4的算法。。就是暴力枚举,肯定是不行的了,最后的时候还是队友把思路一步步转正,最终把这个题出了,首先我们肯定不能枚举所有的子矩阵,所以我们必须换个思路因为这个矩阵中所有的数都是1~n*m的全排列,这一点让我比较在意,可以利用到的信息就是在第一个矩阵中随便找一个数都...原创 2019-11-30 18:48:51 · 548 阅读 · 0 评论 -
POJ - 3926 Parade(单调队列优化dp)
题目链接:点击查看题目大意:给出一个n*m的街道,其中有(n+1)*m条街道,每条街道都有一个值,现在我们需要从最下面的任意一点出发,到达最上面的任意一点结束,问如何规划路线能让沿途经过的街道的权值和最大,现在多了一个规则,就是横向的街道每次最多只能走k个单位的距离题目分析:首先我们在读入数据的时候可以将行反转一下,这样题目就转换成了从第一行任意一点出发,到最后一行任意一点结束,所能产生的...原创 2019-11-25 23:41:05 · 370 阅读 · 0 评论 -
POJ - 2201 Cartesian Tree(笛卡尔树-单调栈/暴跳父亲)
题目链接:点击查看题目大意:给出n个节点的key和val,构造出其笛卡尔树的原型笛卡尔树的定义:所谓笛卡尔树,就是将给定的n个二元组(key,val)建成一棵树。使得:如果只关注key,那么这是一棵二叉搜索树 如果只关注val,那么这是一个堆 对于任意三个节点fa,ls,rs,满足: key[ls]<key[fa]<key[rs] val[fa]>=ma...原创 2019-11-25 14:05:00 · 424 阅读 · 1 评论 -
CodeForces - 91B Queue(单调队列+二分)
题目链接:点击查看题目大意:给出一个队列,队列中按照顺序有n只海豹在排队,每一只海豹都有一个数值表示年龄,如果在某只前面有年龄比他小的海豹,他会变得很不开心,不开心的值就是在比他年龄小的海豹中选择距离他最远的那只海豹,不开心的值就是这两只海豹之间的海豹数量,现在要求计算出每一只海豹的不开心值,当一只海豹前面没有比他年龄小的海豹,则他的不开心值是-1题目分析:因为这个题目需要维护每一只海豹前...原创 2019-11-25 02:24:08 · 518 阅读 · 0 评论 -
HDU - 3530 Subsequence(单调队列+思维)
题目链接:点击查看题目大意:给出一段长度为n的序列,现在给出一个m和一个k,必须满足一段连续区间内的最大值与最小值的差值大于等于m并且小于等于k,问满足条件的连续区间的最大长度题目分析:一开始看到连续区间就想到了尺取,用尺取写了一发直接WA掉了,后来想了一下,这个题目和尺取没什么关系,因为区间内的最大值和最小值并不会因为两个指针的移动而成线性的改变,他们的变化是无规律的,所以更不能二分了(...原创 2019-11-19 21:01:08 · 291 阅读 · 0 评论 -
POJ - 3250 Bad Hair Day(单调队列/单调栈)
题目链接:点击查看题目大意:给出n只牛,高度参差不齐,所有的牛都朝向右边,他们可以看到右边所有没有遮挡并且比自己低的牛,问每只牛可以看到的牛的数量总和是多少题目分析:这个题目让求每只牛看到的牛的数量,我们可以转换一下,转化成每只牛被看到过多少次,这样就可以转换成单调队列/单调栈的题目了,大概就是维护一下当前位置x之前有多少头牛比自己高即可,很简单的实现,直接看代码吧代码:单调栈:...原创 2019-11-19 17:50:18 · 195 阅读 · 0 评论 -
洛谷 - P1714 切蛋糕(单调队列+前缀和+思维)
题目链接:点击查看题目大意:给出一个由n个数组成的序列,求长度不超过m的连续子段和中的最大值题目分析:因为给出了一个限制条件,所以这就不能当普通的动态规划来做了,我们可以跑一遍前缀和,然后枚举每一个位置当做子段和截止的位置,用单调队列维护区间[i-m,i]中的最小值,最小值的下标记为j,这样就能让a[i]-a[j]最大了很巧妙的思路。。真的想不到,可能思维太菜了吧代码:#in...原创 2019-11-19 17:39:52 · 437 阅读 · 0 评论 -
洛谷 - P1725 琪露诺(动态规划+单调队列优化)
题目链接:点击查看题目大意:给出一个由n个节点组成的数轴,每个点上都有一个权值,现在规定当在点x处时,下一步只能去[x+l,x+r]之间的任意一点,现在规定终点是点n之后的所有节点,现在问如何规划路线才能让从起点到终点途径的权值和最大题目分析:因为要求权值和最大,我们可以用动态规划来解决,很简单的一个dp,先设dp[i]是到达点i的最大权值和,那么我们知道点i可以到达[i+l,i+r]之间...原创 2019-11-19 16:38:26 · 328 阅读 · 0 评论 -
洛谷 - P1886 滑动窗口(单调队列/线段树)
题目链接:点击查看题目大意:给出一个由n个数构成的序列,再给出一个长度为k的窗口,这个窗口从第一个下标开始一直向后移动,每次移动一个单位,每次移动询问一次该窗口中的最大值和最小值,最后输出答案题目分析:看似是一个模拟,其实暴力模拟肯定会爆,因为涉及到区间最值问题,而且还是静态的询问,所以这个题目有三种方法可以解决,分别是st表,线段树和单调队列,因为st表我不会优化,所以有五个测试点MLE...原创 2019-11-19 12:53:28 · 345 阅读 · 0 评论 -
HDU - 5875 Function(单调栈)
题目链接:点击查看题目大意:给出一段连续数列,在给出m个询问,要求按照给出的函数查询得到结果题目分析:第一眼一看题目会觉得是个递归题目,但是盲目递归肯定会TLE,所以我们要分析这个题目到底要干什么,这个题目其实就是问在闭区间[l,r]内,一开始数字为a[l],然后依次对a[l+1]到a[r]取模,即连续取模,分析了半天发现也没有什么性质,但是却发现了一个小技巧,就是当一个数取模时,如果模比...原创 2019-08-29 18:56:00 · 250 阅读 · 0 评论