滑动窗口求区间最小值–单调队列

题目如下----转自洛谷

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

第一行两个数n,m。
第二行,n个正整数,为所给定的数列。
输出格式:

n行,第i行的一个数ai,为所求序列中第i个数前m个数的最小值。
输入输出样例

输入样例#1:

6 2
7 8 1 4 3 2

输出样例#1:

0
7
7
1
1
3

【数据规模】

m≤n≤2000000
ai≤3×107a_i\leq 3\times 10^7ai​≤3×107

这道题作为一道标准的模板题,做法并不少暴力的话可以直接一层层搜索,但是时间复杂度尾,可以用线段树,rmq等等,但是身为蒟蒻一枚的我都不会,怎么办怎么办?经过了H巨佬的点播,我明白了,原来这玩意可以不用涉及到什么高级的算法,只需要一个简简单单的队列就可以搞定,而且时间复杂度为O(n),是不是很神奇,但是,理想很丰满,现实很骨感,实现这个操作并非易事(对于蒟蒻的我来说),所以特写博客一篇作为纪念。

首先,要找滑动区间的最值,为了避免多次的重复搜索,我们就需要一个状态数组来记录以前的搜索记录,首先想到的就是记录下扫描到每一个点时候的区间最小值,但这样做有一个问题——我们并不知道存下来的最小值是否已经在范围m之外,这样一来,又需要继续扫描来判定上一个元素的最值是否有效,否则重新搜索,这样一来时间复杂的就回到了n方 ,离O(n)的现实还有那么一点远。亡羊补牢,为时不晚,换一个思路,发现如果我们对这种状态有“保质期”的元素存储下标的话,那么就会很容易地判断此元素是否在范围m之外,并且通过下标提取元素也十分方便,那么如何在最小的时间取到最小值呢?我们可以使用单调队列让队列的末端永远都是在保质期内的最小值,保质期过了就把它踢掉,这样一来问题就很好解决了。
附上代码

#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cstring>using namespace std;deque <int> q;
deque <int>::iterator it;int a[12345678],b[12345687]; int main()
{//  freopen("testdata.in","r",stdin);int n,k;cin>>n>>k;for(int i=0;i<n;i++)scanf("%d",&a[i]);printf("0\n");for(int i=0;i<n;i++){while(!q.empty() && a[q.back()] >= a[i])    q.pop_back();q.push_back(i);        //下标入队 //   printf("i: %d q.front: %d\n",i,q.front());b[i] = a[q.front()];if(q.front() <= i-k+1 && i>=k-1)q.pop_front();} for(int i=0;i< n-1;i++)printf("%d\n",b[i]);return 0;}

perfect!

区间划定最小值题解--单调队列相关推荐

  1. HDU - 3530 Subsequence(单调队列+思维)

    题目链接:点击查看 题目大意:给出一段长度为n的序列,现在给出一个m和一个k,必须满足一段连续区间内的最大值与最小值的差值大于等于m并且小于等于k,问满足条件的连续区间的最大长度 题目分析:一开始看到 ...

  2. [线段树 标记永久化 单调队列] BZOJ 1171 大sz的游戏 BZOJ 2892 强袭作战

    很好的题解:http://blog.sina.com.cn/s/blog_76f6777d0101dizp.html "考虑裸的n^2暴力dp. dp[i]=min(dp[j])+1 ( d ...

  3. 洛谷试炼场 4-8单调队列

    layout: post title: 洛谷试炼场 4-8单调队列 author: "luowentaoaa" catalog: true mathjax: true tags: ...

  4. HDU 4122 Alice's mooncake shop 单调队列优化dp

    Alice's mooncake shop Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem ...

  5. 洛谷 - P1886 滑动窗口(单调队列/线段树)

    题目链接:点击查看 题目大意:给出一个由n个数构成的序列,再给出一个长度为k的窗口,这个窗口从第一个下标开始一直向后移动,每次移动一个单位,每次移动询问一次该窗口中的最大值和最小值,最后输出答案 题目 ...

  6. 【BZOJ-28921171】强袭作战大sz的游戏 权值线段树+单调队列+标记永久化+DP...

    2892: 强袭作战 Time Limit: 50 Sec  Memory Limit: 512 MB Submit: 45  Solved: 30 [Submit][Status][Discuss] ...

  7. HDU 6194 string string string :后缀数组+单调队列 | 后缀自动机

    题意:给出一个字符串,求出出现了恰好k次的子串的个数. 题解:恰好k次 = 至少k次 - 至少k+1次.答案转化为求至少出现k次的子串个数统计.构造好后缀数组以及很重要的Height数组之后.用一个k ...

  8. Luogu P3594 [POI2015]WIL-Wilcze doły(单调队列)

    传送门 题面: 题解: 首先我们要发现,假如右端点为 i i i ,能到达的最远的左端点为 j j j 时,那么 右端点为 i + 1 i+1 i+1 时,能到达的最远左端点一定大于等于 j j j ...

  9. jzoj3895-数字对【RMQ,GCD,二分答案,单调队列】

    正题 题目大意 一个序列aaa 对于[L..R][L..R][L..R]若ak∈[L..R]∣ai∈[L..R]a_k \in [L..R]|a_i\in[L..R]ak​∈[L..R]∣ai​∈[L ...

最新文章

  1. [转]struts2处理.do后缀的请求
  2. 20、Flask实战第20天:Flask上下文
  3. MySQL之某个表中有近千万数据且CRUD访问缓慢的优化处理
  4. 8位移位寄存器和优先编码器
  5. 飞畅科技教你如何选择合适的交换机?
  6. python import _ssl_Python 3没有名为’_ssl’的模块
  7. 在Ubuntu18.04上安装Nvidia驱动
  8. StringUtils 中 isEmpty 和 isBlank 的区别
  9. EasyRecovery 618年度大促销,走过路过不要错过!
  10. GMM R语言程序 gmm包的使用
  11. 三维动画制作软件有哪些?
  12. #pragma once 用法总结
  13. No active profile set, falling back to default profiles: default
  14. Fibonacci Additions (区间加优化)
  15. 强制卸载阿里云盾(安骑士)监控屏蔽云盾IP检测教程
  16. meta20 无法安装 google play_【黑科技】安卓手机安装Google Play
  17. 【ATE-SENT协议】使用LabVIEW采集并解析SENT协议
  18. 基于英飞凌TLE8242-2L的开关/比例电磁阀驱动电路
  19. 如果你的网站需要免费的 SVG 插图,一定不要错过 Undraw 这个网站
  20. 你了解区块链资产吗?新手要如何投资区块链资产?

热门文章

  1. 基于Java实现的中文分词系统
  2. 【C语言】初识二级指针
  3. 数据之道读书笔记-06面向“自助消费”的数据服务建设
  4. 写作副业怎么弄?写文章的副业应该怎么做?
  5. 51智能小车超声波避障
  6. 解决addClass不起作用的小妙招
  7. python 速度矢量_Python TVTK 标量数据可视化与矢量数据可视化
  8. Java 16只球队分组
  9. (转)认识SAP SD销售模式之寄售销售
  10. 网络攻击图系统的设计与实现 文档+PPT+代码程序