题目链接

https://www.luogu.org/problemnew/show/P1440


显然是一道单调队列题目……


解题思路

对于单调队列不明白的请看这一篇博客:https://www.cnblogs.com/yinyuqin/p/10492882.html

这道题和模板唯一的不同点就是从0开始,一直输出n次。什么意思呢?

  • 普通单调队列:单调队列中数据到达m个再输出
  • 本题:从没有数据时就开始输出。

详细点说,就是输出0到0,0到1,0到2……一直到0到m-1,接着是1到m,2到m+1,3到m+2……一直到n-m到n-1的最小值。

具体可以研究一下样例,很容易就可以理解。

所以我们只需要在输出上做一点修改。

如果队列为空,说明这是第一个元素,就输出0到0之间的最小值,显然是0。

否则就每次在读入一个数之前,就输出单调队列里面的最小值。

而且我们发现,最后读入的数其实是没有用的!!坑啊

艰辛的做题过程

首先是TLE:

找了好长时间的bug,没想到竟然是cin cout 搞的!!盘他

十年oi一场空,cin、cout见祖宗。

然后是莫名RE:

原来当m==1时,少判断了一个q.empty()会爆掉。。。

无语。。。。。

AC代码

 #include<iostream>
#include<deque>
#include<cstdio>
using namespace std;
int n,m;
struct num{ //储存每一个点的信息
int cnt,value; //cnt是编号 value是值
num(int a,int b):cnt(a),value(b){}//构造函数
};
deque<num> q; //定义一个双端队列,注意头文件
void makeq(int i,int in){ //见另一篇博客
if(q.empty()) q.push_back(num(i,in));
else{
num f=q.front();
if(i>=f.cnt+m) q.pop_front();
if(!q.empty()){ //注意判断队列是否为空
num b=q.back();
while(in<=b.value){
q.pop_back();
if(q.empty()) break;//注意再次判断队列是否为空
b=q.back();
}
}
q.push_back(num(i,in));
}
}
int main(){
cin>>n>>m;
for(int i=;i<=n;i++){
if(q.empty()) printf("0\n");//第一个输出0
else printf("%d\n",q.front().value);//后来每次输出单调队列的最小值
int in;
scanf("%d",&in); //注意用scanf
makeq(i,in); //让这个点入队
}
return ;
}

洛谷 P1440 求m区间内的最小值(单调队列)的更多相关文章

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

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

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

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

  3. [洛谷P1440]求m区间内的最小值

    题目大意:给你n个数,求出每个数前m位的最小值 题解:单调队列,用一个可以双向弹出的队列来存一串数,满足里面的数具有单调性,我们可以假设它是单调递增的,即求最小的数.那么可以把要插入的这个数与队尾元素 ...

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

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

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

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

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

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

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

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

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

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

  9. luogu P1440 求m区间内的最小值

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

随机推荐

  1. 行人重识别(ReID) ——基于MGN-pytorch进行可视化展示

    下载MGN-pytorch:https://github.com/seathiefwang/MGN-pytorch 下载Market1501数据集:http://www.liangzheng.org/ ...

  2. 02.Windows2012R2安装360安全卫士失败及无法卸载问题

    问题: Windows 2012 R2 安装360安全卫士失败及无法卸载,导致网络无法通信问题解决. 解决:1.进入 Windows2012R2 安全模式下:2.进行覆盖安装360安全卫士:3.覆盖安 ...

  3. 一、Core的布局页、起始页及错误页

    一.布局页面: 使用布局页相当于一个母版页,可以将各个页面公用部分,如上方标题区.左侧导航菜单区.下方版权声明及状态显示区以及通用的js及css引用等,集中放到布局页管理,具体功能页面只需关注自己独有 ...

  4. sort 文本排序

    1.命令功能 sort 将输入的文件内容按照指定的规则排序,然后将排序的内容输出. 2. 语法格式 sort  option  file 参数说明 参数 参数说明 -b 忽略每行开头的空格 -n 根据 ...

  5. 获取服务进程server.exe的pid(0号崩溃)

    #include "stdafx.h" #include <windows.h> #include <iostream> #include <COMD ...

  6. maven 提取jar包 依赖及打包排除

    <properties> <project.targetDir>D:\jar</project.targetDir> <project.targetServe ...

  7. App中h5音频不能播放问题

    前置:以下问题是针对vue项目的解决方案 问题一:IOS中音频不能自动播放 原因:ios禁止了音频自动播放 解决办法:在vue的生命周期mounted中获取音频Dom并调用音频播放方法play(),注 ...

  8. 【HDOJ6662】Acesrc and Travel(树形DP,换根)

    题意:有一棵n个点的树,每个点上有两个值a[i],b[i] A和B在树上行动,A到达i能得到a[i]的偷税值,B能得到b[i],每次行动只能选择相邻的点作为目标 两个人都想最大化自己的偷税值和对方的差 ...

  9. bzoj 2002 Bounce 弹飞绵羊(分块)

    2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 11202  Solved: 5698[Subm ...

  10. 【SpringBoot】 Java中如何封装Http请求,以及JSON多层嵌套解析

    前言 本文中的内容其实严格来说不算springboot里面的特性,属于JAVA基础,只是我在项目中遇到了,特归纳总结一下. HTTP请求封装 目前JAVA对于HTTP封装主要有三种方式: 1. JAV ...