单调队列&单调栈归纳
单调队列
求长度为M的区间内的最大(小)值
单调队列的基本操作,也就是经典的滑动窗口问题。
求长度为M的区间内最大值和最小值的最大差值
两个单调队列,求出长度为M的区间最大最小值的数组,分别求最大最小值。
求边长为a的正方形内最大值和最小值的最大差值([HAOI2007]理想的正方形)
一个大体的思路是先分别求出以i,j为左上端点的边长为a的矩形中的最大值和最小值。那么该怎么做?,先用单调队列求出一个点右边a个单位的最大值,形成一个新矩阵,再求出新矩阵下边a个单位的最大值。然后最小值再求一边,最后统计答案。有的题有点变态,需要求,一个矩形中,一个A行B列矩阵权值和减去其中一个C行D列矩阵权值和的最大值。只要想到把C行D列矩阵缩成一个点,然后套本题的解法就行了。
求最大值和最小值差值小于D的区间的最小长度
问题显然具有单调性,单调队列右端点先扩展,直到满足差值小于D,左端点再尽量收缩。实现有一些代码技巧。
那么如果区间中的每个点有两个关键字a,b,问题改成求最大a值与最小b值的差值呢?
同时操作两个单调队列就行了。
求给定序列长度不超过M的最大连续字段和(P1714切蛋糕)
觉得有一定难度,实际上就是求max(sum[i]-sum[j])(i>=j,0<=i-j<m),所以就要用前缀和,然后直接两个单调队列分别求最大最小值不行,因为不知道i是否大于等于j,所以转化一下,就是求sum[i]-min(sum[j])(i>=j,0<=i-j<m),复杂度就多了个O(N),这样就可以解决这个问题了。
单调栈
其实单调栈就是左端点不移动的单调队列。
找到每一个a[i]右(左)边第一个比a[i]大(小)的数
单调栈的基本操作,正处理的数比栈顶的数大(小)时弹栈,给弹栈的数记录一下就行了。用这种方法也可以求出左边和右边最后一个比它大(小)的数。
矩形面积最大
一种题是规定矩形的一边一定,且都在x轴上,用单调栈求出一个矩形左边和右边最后一个长比它长的矩形。然后统计一下答案,这里用了贪心的思想,保证包含最优解,复杂度为O(N)。然后一种题是在平面内的,给出一些点是否合法,求一个包含点都为合法的矩形的最大面积。上一种题的扩展,把每一行都当做一次x轴都统计一下答案就行了。这种题型可以拓展到答案涉及到区间最小值且拥有单调性的一系列问题。
单调队列&单调栈归纳的更多相关文章
- 单调队列 && 单调栈
单调队列 && 单调栈 单调队列 维护某个滑动区间的min or max,可用于dp的优化 以维护min为例,采用STL双端队列实现 每次加入元素x前 先检查队首元素==滑动后要删除的 ...
- 联赛模拟测试18 A. 施工 单调队列(栈)优化DP
题目描述 分析 对于 \(Subtask\ 1\),可以写一个 \(n^3\) 的 \(DP\),\(f[i][j]\) 代表第 \(i\) 个建筑高度为 \(j\) 时的最小花费,随便转移即可 时间 ...
- 数据结构录 之 单调队列&单调栈。
队列和栈是很常见的应用,大部分算法中都能见到他们的影子. 而单纯的队列和栈经常不能满足需求,所以需要一些很神奇的队列和栈的扩展. 其中最出名的应该是优先队列吧我觉得,然后还有两种比较小众的扩展就是单调 ...
- 单调队列&单调栈
单调队列 例题: Poj 2823给定一个数列,从左至右输出每个长度为m的数列段内的最小数和最大数.数列长度:N<=106,m<=N 对于单调队列,我们这样子来定义: 1.维护区间最值 2 ...
- 数据结构录 之 单调队列&单调栈。(转)
http://www.cnblogs.com/whywhy/p/5066306.html 队列和栈是很常见的应用,大部分算法中都能见到他们的影子. 而单纯的队列和栈经常不能满足需求,所以需要一些很神奇 ...
- 大视野 1012: [JSOI2008]最大数maxnumber(线段树/ 树状数组/ 单调队列/ 单调栈/ rmq)
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 9851 Solved: 4318[Submi ...
- 小Z爱序列(NOIP信(sang)心(bin)赛)From FallDream(粗制单调队列&单调栈的算法解析)
原题: 小Z最擅长解决序列问题啦,什么最长公共上升然后下降然后上升的子序列,小Z都是轻松解决的呢. 但是小Z不擅长出序列问题啊,所以它给了你一道签到题. 给定一个n个数的序列ai,你要求出满足下述条件 ...
- POJ 3494 Largest Submatrix of All 1’s 单调队列||单调栈
POJ 3494 Largest Submatrix of All 1’s Description Given a m-by-n (0,1)-matrix, of all its submatrice ...
- 【NOIP数据结构专项】单调队列单调栈
[FZYZ P1280 ][NOIP福建夏令营]矩形覆盖 Description 有N个矩形,矩形的底边边长为1,且均在X轴上,高度给出,第i个矩形的高为h[i],求最少需要几个矩形才能覆盖这个图形. ...
随机推荐
- hihocoder1415 重复旋律3
思路: 扫一遍height 判一下即可 //By SiriusRen #include <cstdio> #include <cstring> #include <alg ...
- Linux java9 jshell操作
1.上传 2.解压 配不配环境变量都行 进入到jdk-9.0.4的bin目录下 执行./jshell命令 我第一次出现如下的情况 等了一会没反应就ctrl+z了.然后又重新执行./shell命令 超时 ...
- Swift学习笔记(6):控制流
目录: For-In While If-Else, Guard-Else Switch 控制转移 For-In 可以使用for-in语句循环遍历集合.区间.元组.字符串. // 遍历区间,返回元素值 ...
- Android RecyclerView 设置item间隔的方法
RecyclerView大家常用,但是如何给加载出来的item增加间隔很多人都不知道,下面是方法,直接上代码了: LinearLayoutManager layoutManager = new Lin ...
- 适配器模式(Adapter):类适配器、对象适配器
适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口.A d a p t e r 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 适用场景: 1.已经存在的类的接口 ...
- vue 锚点定位
vue 锚点定位 <template> <div class="details"> <div class="wrapper w"& ...
- (六)Redux进阶
1 UI组件与容器组件的拆分 UI组件(傻瓜组件):只负责页面显示,没有任何逻辑 容器组件(聪明组件):并不去管UI到底长成什么样,关注的是整个业务逻辑 2 无状态组件 一个普通的函数就是无状态组件 ...
- css 遮照镂空效果
实现这个效果有以下几种方式.(欢迎指出不足之处!!!) 一:最简单最粗暴的方法!截图! 实现原理:先截一张图片,然后写一个遮罩层,再把图片放上去就可以了! 过程过于简单,就别写代码跟截图效果了! 优 ...
- 洛谷 P1220 关路灯 (贪心+区间dp)
这一道题我一直在想时间该怎么算. 看题解发现有个隐藏的贪心. 路径一定是左右扩展的,左右端点最多加+1(我竟然没发现!!) 这个性质非常重要!! 因此这道题用区间dp f[i][j]表示关完i到j的路 ...
- 紫书 习题8-12 UVa 1153(贪心)
本来以为这道题是考不相交区间, 结果还专门复习了一遍前面写的, 然后发现这道题的区间是不是 固定的, 是在一个范围内"滑动的", 只要右端点不超过截止时间就ok. 然后我就先考虑有 ...