单调队列&单调栈归纳
单调队列
求长度为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],求最少需要几个矩形才能覆盖这个图形. ...
随机推荐
- Z 字形变换 C++实现 java实现 leetcode系列(六)
Z 字形变换 java实现 C++实现 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 ...
- P3809 【模版】后缀排序
题目背景 这是一道模版题. 题目描述 读入一个长度为 nn 的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置.位置编 ...
- RGB颜色值与十六进制颜色码转换工具
RGB颜色值转换成十六进制颜色码: 十六进制颜色码转换成RGB颜色值: 颜色码对照表 颜色 英文代码 形象描述 十六进制 RGB LightPink 浅粉红 #FFB6C1 255, ...
- 51nod 1717 好数 (水题)
题目: 看起来很复杂,其实就是有多少个素因子就翻转多少次. 然后考虑到只有平方数有奇数个素因子. 一次过,上代码把: #include <iostream> #include <al ...
- vector ----- size函数注意事项
vector 的size函数返回vector大小,返回值类型为size_type,Member type size_type is an unsigned integral type,即无符号整数: ...
- execlp(3) - Linux手册
名称: execl, execlp, execle, execv, execvp, execvpe:执行文件 总览: #include <unistd.h> extern char **e ...
- LINUX 中 python 版本升级
首先下载源tar包 可利用linux自带下载工具wget下载,如下所示: 1 # wget http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tg ...
- wackoPicko 渗透平台的安装
2016-05-17 wackoPicko 的介绍及下载地址 https://github.com/adamdoupe/WackoPicko#from=codefrom.com 首先我们 ...
- 紫书 例题8-15 UVa 12174 (滑动窗口)
这道题就是给你一n长序列, 然后把这个序列按顺序分成很多段, 每段长s(最前面可以小于s, 只有第一段的后半段, 最后面也同样, 只有最后一段的前半段), 然后要求是每一段里面没有重复的数, 问你有几 ...
- C# 获取本地电脑所有的盘符
话不多说,直接上菜: public List<string> GetRemovableDeviceID() { List<string> deviceIDs = new ...