洛谷 P1440 求m区间内的最小值(单调队列)
题目链接
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区间内的最小值(单调队列)的更多相关文章
- 洛谷 P1440 求m区间内的最小值
传送门 思路 由于数据范围很大,所以使用单调队列,和滑动窗口这道题类似 首先第一个数输出\(0\),因为第一个数之前没有数 然后通过样例我们发现,最后一个数并没有派上什么用场,所以循环\(n-1\)轮 ...
- 洛谷—— P1440 求m区间内的最小值
https://www.luogu.org/problemnew/show/P1440 题目描述 一个含有n项的数列(n<=2000000),求出每一项前的m个数到它这个区间内的最小值.若前面的 ...
- [洛谷P1440]求m区间内的最小值
题目大意:给你n个数,求出每个数前m位的最小值 题解:单调队列,用一个可以双向弹出的队列来存一串数,满足里面的数具有单调性,我们可以假设它是单调递增的,即求最小的数.那么可以把要插入的这个数与队尾元素 ...
- 洛谷1440 求m区间内的最小值
洛谷1440 求m区间内的最小值 本题地址:http://www.luogu.org/problem/show?pid=1440 题目描述 一个含有n项的数列(n<=2000000),求出每一项 ...
- 洛谷 1440 求m区间内的最小值
洛谷 1440 求m区间内的最小值 题目描述 一个含有n项的数列(n<=2000000),求出每一项前的m个数到它这个区间内的最小值.若前面的数不足m项则从第1个数开始,若前面没有数则输出0. ...
- P1886 滑动窗口&&P1440 求m区间内的最小值
声明:下面这两个题就不要暴力了,学一学单调队列吧 推荐博文:https://www.cnblogs.com/tham/p/8038828.html 单调队列入门题 P1440 求m区间内的最小值 题目 ...
- 【题解】P1440 求m区间内的最小值
求m区间内的最小值 题目描述: 一个含有n项的数列(n<=2000000),求出每一项前的m个数到它这个区间内的最小值.若前面的数不足m项则从第1个数开始,若前面没有数则输出0. 分析: 读题之 ...
- P1440 求m区间内的最小值--洛谷luogu
题目描述 一个含有n项的数列(n<=2000000),求出每一项前的m个数到它这个区间内的最小值.若前面的数不足m项则从第1个数开始,若前面没有数则输出0. 输入输出格式 输入格式: 第一行两个 ...
- luogu P1440 求m区间内的最小值
题目描述 一个含有n项的数列(n<=2000000),求出每一项前的m个数到它这个区间内的最小值.若前面的数不足m项则从第1个数开始,若前面没有数则输出0. 输入输出格式 输入格式: 第一行两个 ...
随机推荐
- 在eclipse里搜索maven项目需要的dependency
eclipse直接就可以通过下载同步仓库索引,直接关键字查询需要的dependency. 前提是你已经在你的eclipse上配好了maven正确的环境. 1. 设置在开启eclipse时下载同步仓库索 ...
- Docker备份与迁移
容器保存为镜像 通过以下命令将容器保存为镜像: docker commit [-m="提交的描述信息"] [-a="创建者"] 容器名称|容器ID 生成的镜像名 ...
- 彻底解决mysql报错:1030, 'Got error 28 from storage engine'
权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/harry5508/article/deta ...
- 02.Linux-CentOS系统Firewalld防火墙配置
1.firewalld的基本使用 启动: systemctl start firewalld关闭: systemctl stop firewalld查看状态: systemctl status fir ...
- Airbnb JavaScript 编码风格指南(2018年最新版)
原网址 : https://segmentfault.com/a/1190000013040555 类型 基本类型:直接存取 string number boolean null undefined ...
- 使用GDB调试时attach ID不被允许
在进入gdb后,直接使用attach ID,出现下面的情况: Could not attach to process. If your uid matches the uid of the targ ...
- UML快速理解
在团队协作过程中最常见的就是开会.开会最常用的就是图,而图中最常见的就是流程图.时序图.类图,这三个图可以清楚的描述你想解释的内容.学好类图不仅仅能帮助自己更清楚的梳理业务,还能提高开会效率. 上图是 ...
- bzoj5178 [Jsoi2011]棒棒糖 主席树+线段树二分
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5178 https://lydsy.com/JudgeOnline/problem.php?id ...
- pytorch 指定GPU训练
# 1: torch.cuda.set_device(1) # 2: device = torch.device("cuda:1") # 3:(官方推荐)import os os. ...
- mysql 8.0.13 zip windows 10安装
1.下载安装包 https://dev.mysql.com/downloads/mysql/ 下载后解压到D:\Program Files\mysql-8.0.13-winx64 2.添加配置文件my ...