洛谷 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. 输入输出格式 输入格式: 第一行两个 ...
随机推荐
- C#Stopwatch的简单计时 [收藏]
Stopwatch 类 命名空间:System.Diagnostics.Stopwatch 实例化:Stopwatch getTime=new Stopwatch(); 开始计时:getTime.St ...
- P2617 Dynamic Rankings(待修改区间第k大)
题目链接:https://www.luogu.org/problemnew/show/P2617 题目: 题目描述 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的 ...
- nginx http正向代理简单配置及systemd 配置
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #erro ...
- git@github.com出现Permission denied (publickey)
上传项目的时候出现Permission denied (publickey)这个问题 解决方案如下: 看本地的.git/config设置的仓库url地址和github使用的链接地址是否一致如下图,如u ...
- 2018-10-01-weekly
Algorithm 77. 组合 What 给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合. How 利用递归的思想,当凑够k个数时,就回退回去,remove掉一个数,在 ...
- AOP技术介绍--(.Net平台AOP技术研究)
4.1.Net平台AOP技术概览 .Net平台与Java平台相比,由于它至今在服务端仍不具备与unix系统的兼容性,也不具备类似于Java平台下J2EE这样的企业级容器,使得.Net平台在大型的企业级 ...
- Linux Crontab命令定时任务基本语法
一.Crontab查看编辑重启 1.查看crontab定时执行任务列表 crontab -l 2.编辑crontab定时执行任务 crontab -e 3.删除crontab定时任务 crontab ...
- 【Go】Go语言的%d,%p,%v等占位符的使用
golang 的fmt 包实现了格式化I/O函数,类似于C的 printf 和 scanf. # 定义示例类型和变量 type Human struct { Name string } var peo ...
- [IOI2018] meetings 会议
https://www.luogu.org/problemnew/show/P5044 题解 这种关于最大值或者最小值的问题,可以往笛卡尔树的方面想. 先考虑一个朴素的\(dp\),设\(dp[l][ ...
- 对拍 & 随机数生成
用 Windows 批处理对拍: 1. 新建一个批处理(.bat),代码如下: :loop@echo off data_creator.exe force_solution.exe correct_s ...