Sliding Window POJ - 2823 单调队列模板题
Sliding Window POJ - 2823 单调队列模板题
题意
给出一个数列 并且给出一个数m 问每个连续的m中的最小\最大值是多少,并输出
思路
使用单调队列来写,拿最小值来举例
要求区间最小值 就是维护一个单调递增的序列
对于样例
8 3
1 3 -1 -3 5 3 6 7
我们先模拟一遍
1.队列为空 1 进队 队列:1
2.3>队尾元素 3 进队 队列: 1 3
3.-1小于队尾元素,一直从尾部出队知道找到比-1小的元素或者队列为空 队列:-1
当队列中元素大于m的时候从队头删除元素直到队列元素小于等于m
每次操作完后取队头元素就是m区间的最小值
原理
这里其实运用了一种贪心和时间的思想
当要进区间的数小于之前队列里的所有的数的时候,这个时候之前的数都没用了,因为只要包括了这个数的区间,最小值一定是小于等于这个数的,而窗口已经滑动了包括这个数了,所以之前包括这个数的区间的大于其的值都可以舍弃了
当要进区间的数不是小于之前队列里的所有的数的时候,比这个数小的数如果条件允许(也就是队列小于等于m)要保留,因为这个时候窗口最小的数是队列头的数,而进区间的数是区间第k小,只有当窗口不包括最小的这个数,队头才能出队
这其实运用了一种时间的概念(也可是说是窗口位置的变化趋势)把没有营养的元素剔除了,维护了一个单调增队列相当于维护了一个 rank ,当rank高的被封号了(窗口不包括前面的数)或者rank高的之前封号的解封了(窗口包括后面的数)rank 低的才能上来。
#include<cstdio>
#include<iostream>
using namespace std;
int n,m;
const int maxn=1e6+7;
int a[maxn],q[maxn];
void getmin(){
int head=1,tail=0;
for(int i=1;i<=n;i++){
if(tail<head)q[++tail]=i;
else {
while(tail>=head&&i-q[head]+1>m)head++;
while(tail>=head&&a[q[tail]]>a[i])tail--;
q[++tail]=i;
}
if(i>=m){
printf("%d ",a[q[head]]);
}
}
}
void getmax(){
int head=1,tail=0;
for(int i=1;i<=n;i++){
if(tail<head)q[++tail]=i;
else {
while(tail>=head&&i-q[head]+1>m)head++;
while(tail>=head&&a[q[tail]]<a[i])tail--;
q[++tail]=i;
}
if(i>=m){
printf("%d ",a[q[head]]);
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
getmin();
cout<<endl;
getmax();
return 0;
}
Sliding Window POJ - 2823 单调队列模板题的更多相关文章
- poj 2823单调队列模板题
#include<stdio.h>//每次要吧生命值长的加入,吧生命用光的舍弃 #define N 1100000 int getmin[N],getmax[N],num[N],n,k, ...
- caioj 1172 poj 2823 单调队列过渡题
给定一个n个数的数列,从左至右输出每个长度为m的数列段内的最大数. 输入:第一行两个整数n和m( 1<= n <= 20 0000,m<=n).下来给出n个整数. 输出:一行一个整数 ...
- luoguP1886 滑动窗口(单调队列模板题)
题目链接:https://www.luogu.org/problem/P1886#submit 题意:给定n个数,求大小为k的滑动窗口中最小值和最大值. 思路:单调队列模板题. AC代码: #incl ...
- 单调栈(G - Sliding Window POJ - 2823 )
题目链接:https://cn.vjudge.net/contest/276251#problem/G 题目大意:给你n和m,然后问你对于(m,n)这中间的每一个数,(i-m+1,i)这个区间的最小值 ...
- POJ 2823 单调队列入门水题
最最基础的单调队列题目.一个单增一个单减.还是可以借此好好理解一下单调队列的. #include <stdio.h> #include <string.h> #include ...
- Sliding Window - 题解【单调队列】
题面: An array of size n ≤ 106 is given to you. There is a sliding window of size k which is moving fr ...
- AC日记——Sliding Window poj 2823
2823 思路: 单调队列: 以前遇到都是用线段树水过: 现在为了优化dp不得不学习单调队列了: 代码: #include <cstdio> #include <cstring> ...
- poj 2823 单调队列
思路:裸的单调队列. #include<iostream> #include<cstring> #include<cstdio> #include<algor ...
- [POJ2823]Sliding Window 滑动窗口(单调队列)
题意 刚学单调队列的时候做过 现在重新做一次 一个很经典的题目 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗 ...
随机推荐
- Linux 宝塔面板忘记密码的解决方案
进入ssh 输入以下命令重置密码(把命令最后面的 “testpasswd” 替换成你要改的新密码)注:若是debian/ubuntu用户,请使用有root权限的账户去执行这条命令 cd /www ...
- 使用javacv 截取视频指定帧节
个人博客 地址:https://www.wenhaofan.com/article/20190407105818 引入依赖 <dependency> <groupId>org. ...
- ubuntu 部署Django项目+uwsgi+Nginx
1.部署框架 Nginx负责静态资源请求,并且把无法处理的请求转发至uwsgi处理 2.安装并配置Nginx 2.1安装 apt-get install nginx (如果安装失败请先升级apt-ge ...
- Linux 一些使用工具
ssh 链接使用工具xshell 下载链接 http://www.onlinedown.net/soft/36383.htm 映射硬盘工具 sftpdriver 安装输入服务器之后链接 并且输入注册码 ...
- html css二级导航栏
二级导航栏制作: 1.将一级导航栏去除列表样式(list-style:none),并给予浮动,使其横向排列(float:left) 2.给每个li中添加一个<a></a>标签, ...
- Java设计模式(工厂模式)
一.简单工厂模式 简单工厂模式就是把对类的创建初始化全都交给一个工厂来执行,而用户不需要去关心创建的过程是什么样的,只用告诉工厂我想要什么就行了.而这种方法的缺点也很明显,违背了设计模式的开闭原则,因 ...
- java类及实例初始化顺序
1.静态变量.静态代码块初始化顺序级别一致,谁在前,就先初始化谁.从上而下初始化(只在类加载时,初始化一次) 2.非静态变量.非静态代码块初始化顺序级别一致,谁在前,就先初始化谁.从上而下初始化(只要 ...
- @RendSection{"scripts",require:false}的作用
MVC视图中,Javascripts代码被放于下面的Razor代码中(@section Scripts{}). 好处:在视图进行JavaScript编程时,是一个很好的实践,在共享视图(_Layout ...
- vue报错[Vue warn]: The data property "record" is already declared as a prop. Use prop default value instead.
当我写了一个子组件,点击打开子组件那个方法时报了一个错 这句话说明意思呢?谷歌翻译一下↓ 数据属性“record”已声明为prop. 请改用prop默认值. 感觉翻译的有点怪,通过最后修改代码后大概意 ...
- 关于setTimeout的妙用
定义 在指定的延迟时间之后调用一个函数或执行一个代码片段 这个是setTimeout最主要的功能,但也是很坑的地方,首先javascript其实是运行在单线程的环境下,意味者定时器会在未来的某个时间支 ...