单调队列,顾名思义是指队列内的元素是有序的,队头为当前的最大值(单调递减队列)或最小值(单调递增序列),以单调递减队列为例来看队列的入队和出队操作:

1、入队:

如果当前元素要进队,把当前元素和队尾元素比较,如果当前元素小于队尾元素,那么当前元素直接进队,如果当前元素大于队尾元素,那么队尾出队,将当前元素和新的队尾再做比较,直到当前元素大于队尾元素或者队列为空。单调队列只能在队尾插入元素,队尾和队头都可以删除元素。

2、出队:

出队直接取队头即可,因为用单调队列就是为了取最值,而队头就是最值。

例子:将数组a[] = {3, 5, 2, 8, 1, 4, 7}依次入队,并保证队列为一个 单调递减 队列。

  • 3入队,队列为空直接入队,队列元素为:3;
  • 5入队,5和队尾比较,5大于3,3出队,队为空,5入队,队列元素为:5;
  • 2入队,2和队尾比较,2小于5,直接入队,队列元素为:5,2;
  • 8入队,8和队尾比较,2出队,8再和队尾比较,5出队,队为空,8入队,队列元素为:8;
  • 1入队,...,队列元素为:8,1;
  • 4入队,...,队列元素为:8,4;
  • 7入队,...,队列元素为:8,7。
实例应用:
1、给定一个数组a[]和一个长度为k的滑动窗口,该窗口从最左端移到最右端,找出窗口在每个位置是的最大值。
     例如:a[] = {7, 3, 2, 5, 6},k = 3。我们可以维护一个单调递减队列,这样对于每个位置,当前队列的队头就是最大值,只不过在入队的时候要检查一下队头的下标是否已经超出窗口的范围,如果超出就删除队头元素即可。为了方便写代码,单调队列很多时候保存的是下标,而不是数值本身。
  • i = 0,初始队列为空,7入队,队列为:{ 0(7) }, (0为下标,括号为下标对应的值) ,窗口区间为[0],最大值为队头a[0] = 7;
  • i = 1,队头下标没有超出k, 3入队,队列为:{ 0(7), 1(3) },窗口区间为[0,1],最大值为队头a[0] = 7;
  • i = 2,队头下标没有超出k,2入队,队列为:{ 0{7), 1(3), 2(2) },窗口区间为[0,1,2],最大值为队头a[0] = 7;
  • i = 3,队头下标为0超出k,删除队头,5入队,队列为:{ 3(5) },窗口区间为[1,2,3],最大值为队头a[3] = 5;
  • i = 4,队头下标没有超出k,6入队,队列为:{ 4(6) },窗口区间为[2, 3, 4],最大值为队头a[4] = 6;
  • 窗口继续向右滑动,如果当前队头下标超出范围就删除队头,然后去队头,没有超出范围就直接取队头。
这样整个算法就是O(n)的。
#include<iostream>
#include<cstdio>
using namespace std;
int n,m,a[2000010];
int q[2000010],h=1,t=1;
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
printf("0\n");
q[1]=1;
for(int i=2;i<=n;i++)
{
printf("%d\n",a[q[h]]);
if(q[h]<=i-m)
h++;
while(a[i]<=a[q[t]]&&t>=h)
t--;
t++;
q[t]=i;
}
return 0;
}

单调队列——求m区间内的最小值的更多相关文章

  1. 洛谷1440 求m区间内的最小值

    洛谷1440 求m区间内的最小值 本题地址:http://www.luogu.org/problem/show?pid=1440 题目描述 一个含有n项的数列(n<=2000000),求出每一项 ...

  2. 求m区间内的最小值

    洛谷P1440 求m区间内的最小值 ............................................................................... 以上 ...

  3. P1886 滑动窗口&&P1440 求m区间内的最小值

    声明:下面这两个题就不要暴力了,学一学单调队列吧 推荐博文:https://www.cnblogs.com/tham/p/8038828.html 单调队列入门题 P1440 求m区间内的最小值 题目 ...

  4. 洛谷 P1440 求m区间内的最小值

    传送门 思路 由于数据范围很大,所以使用单调队列,和滑动窗口这道题类似 首先第一个数输出\(0\),因为第一个数之前没有数 然后通过样例我们发现,最后一个数并没有派上什么用场,所以循环\(n-1\)轮 ...

  5. LG1440 求 m 区间内的最小值

    题目描述 一个含有 \(n\) 项的数列 (\(n≤ 2000000\)),求出每一项前的 \(m\) 个数到它这个区间内的最小值.若前面的数不足 \(m\) 项则从第 \(1\) 个数开始,若前面没 ...

  6. 【题解】P1440 求m区间内的最小值

    求m区间内的最小值 题目描述: 一个含有n项的数列(n<=2000000),求出每一项前的m个数到它这个区间内的最小值.若前面的数不足m项则从第1个数开始,若前面没有数则输出0. 分析: 读题之 ...

  7. 洛谷 1440 求m区间内的最小值

    洛谷  1440 求m区间内的最小值 题目描述 一个含有n项的数列(n<=2000000),求出每一项前的m个数到它这个区间内的最小值.若前面的数不足m项则从第1个数开始,若前面没有数则输出0. ...

  8. P1440 求m区间内的最小值--洛谷luogu

    题目描述 一个含有n项的数列(n<=2000000),求出每一项前的m个数到它这个区间内的最小值.若前面的数不足m项则从第1个数开始,若前面没有数则输出0. 输入输出格式 输入格式: 第一行两个 ...

  9. 洛谷—— P1440 求m区间内的最小值

    https://www.luogu.org/problemnew/show/P1440 题目描述 一个含有n项的数列(n<=2000000),求出每一项前的m个数到它这个区间内的最小值.若前面的 ...

随机推荐

  1. B2B、B2C、B2D的简单理解

    B2D现在非常流行,顾名思义,B2D 就是指那些以开发者为对象的服务,它们通过 API 等形式"售卖"自己某一方面的特长.B2D(Business to Developer)市场很 ...

  2. python复杂网络库networkx:基础

    http://blog.csdn.net/pipisorry/article/details/49839251 其它复杂网络绘图库 [SNAP for python] [ArcGIS,Python,网 ...

  3. MongoDB分组

    MongoDB三种分组方式 group(先筛选再分组,不支持分片,对数据量有所限制,效率不高) [简单分组实测150W 12.5s] mapreduce(基于js引擎,单线程执行,效率较低,适合用做后 ...

  4. 软考之路--J2SE,从HelloWorld到传世代码

    "Hello World"程序指的是只在计算机屏幕上输出"Hello, World!"(意为"世界,你好!")这行字符串的计算机程序.hel ...

  5. 【一天一道LeetCode】#72. Edit Distance

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given t ...

  6. OpenCV提取显示一张图片(或者视频)的R,G,B颜色分量

    使用OpenCV可以提分别提取显示一张图片(或者视频)的R,G,B颜色分量.效果如下. 原图: R: G: B: 示例代码如下,貌似很久以前网上找的的,逻辑很清晰,就是把R,G,B三个分量分开,然后显 ...

  7. Mahout 系列之--canopy 算法

    Canopy 算法,流程简单,容易实现,一下是算法 (1)设样本集合为S,确定两个阈值t1和t2,且t1>t2. (2)任取一个样本点p属于S,作为一个Canopy,记为C,从S中移除p. (3 ...

  8. uGUI使用代码动态添加Button.OnClick()事件(Unity3D开发之十二)

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/42705885 ...

  9. 仿百度壁纸客户端(二)——主页自定义ViewPager广告定时轮播图

    仿百度壁纸客户端(二)--主页自定义ViewPager广告定时轮播图 百度壁纸系列 仿百度壁纸客户端(一)--主框架搭建,自定义Tab + ViewPager + Fragment 仿百度壁纸客户端( ...

  10. OpenCV实现仿射变换

    什么是仿射变换?¶ 一个任意的仿射变换都能表示为 乘以一个矩阵 (线性变换) 接着再 加上一个向量 (平移). 综上所述, 我们能够用仿射变换来表示: 旋转 (线性变换) 平移 (向量加) 缩放操作 ...