WINDOW(单调队列的应用)
给你一个长度为 N 的数组,一个长为 K 的滑动的窗体从最左移至最右端,
你只能见到窗口的K个数,每次窗体向右移动一位,如下表:

你的任务是找出窗口在各位置时的 max value,min value.
INPUT:
第 1 行 n,k,
20%:n<=500;
50%: n<=100000;
100%: n<=1000000;
第 2 行为长度为 n 的数组
8 3
1 3 -1 -3 5 3 6 7
OUTPUT:
2 行,
第 1 行每个位置的 min value,
第 2 行每个位置的 max value
-1 -3 -3 -3 3 3
3 3 5 5 6 7
题解:
如果每次都要sort的话,小数据可以O(n*k),但是数据大的话一定会超时。
那么该如何搞呢? 单调队列。O(n)效率很高!!
单调队列,一个元素单调的队列,可以保证队头是最小(最大)的;
可以通过队首删除,队尾插入来维护最优值。
这道题,就是通过单调队列来维护一个最大值和最小值。
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<cstdlib>
#include<iomanip>
#include<ctime>
using namespace std;
const int maxn=;
int n,k;
int a[maxn],q[maxn];
int tail=,head=; int main()
{
cin>>n>>k;
for(int i=;i<=n;i++)
cin>>a[i];
q[tail]=;
for(int i=;i<k;i++)
{
while(a[i]<a[q[tail]]&&tail>=head)
{
tail--;
}
q[++tail]=i;
}
for(int i=k;i<=n;i++)
{
if(i-q[head]==k) head++;
while(a[i]<a[q[tail]]&&tail>=head)
{
tail--;
}
q[++tail]=i;
cout<<a[q[head]]<<" ";
}
cout<<endl;
memset(q,,sizeof(q));
head=,tail=;
q[tail]=;
for(int i=;i<k;i++)
{
while(a[i]>a[q[tail]]&&tail>=head)
{
tail--;
}
q[++tail]=i;
}
for(int i=k;i<=n;i++)
{
if(i-q[head]==k) head++;
while(a[i]>a[q[tail]]&&tail>=head)
{
tail--;
}
q[++tail]=i;
cout<<a[q[head]]<<" ";
}
cout<<endl;
return ;
}
WINDOW(单调队列的应用)的更多相关文章
- POJ 2823 Sliding Window + 单调队列
一.概念介绍 1. 双端队列 双端队列是一种线性表,是一种特殊的队列,遵守先进先出的原则.双端队列支持以下4种操作: (1) 从队首删除 (2) 从队尾删除 (3) 从队尾插入 (4) ...
- poj 2823 Sliding Window (单调队列入门)
/***************************************************************** 题目: Sliding Window(poj 2823) 链接: ...
- POJ2823 Sliding Window(单调队列)
单调队列,我用deque维护.这道题不难写,我第二次写单调队列,1次AC. -------------------------------------------------------------- ...
- POJ 2823:Sliding Window 单调队列
Sliding Window Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 48930 Accepted: 14130 ...
- POJ 2823 Sliding Window (单调队列)
单调队列 加了读入挂比不加更慢.... 而且这份代码要交c++ 有大神G++跑了700ms..... orzorzorz #include<iostream> #include<cs ...
- POJ 2823 UESTCoj 1221 Sliding Window 单调队列 经典入门题
题意:给出一个序列,求出每连续k个数字中最大的数和最小的数. 这是道单调队列裸题,直接写就行了. 本来用deque写出来后,发现在poj上硬是超时了,在discuss上看很多人也在抱怨超时的问题,据说 ...
- poj2823Sliding Window——单调队列
题目:http://poj.org/problem?id=2823 单调队列模板. 代码如下: #include<iostream> #include<cstdio> usin ...
- 【t019】window(单调队列)
Time Limit: 2 second Memory Limit: 256 MB [问题描述] 给你一个长度为N 的数组,一个长为K的滑动的窗体从最左移至最右端,你只能见到窗口的K个数,每次窗体向右 ...
- POJ2823 Sliding Window (单调队列)
POJ2823 Sliding Window Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 38342 Accepte ...
- POJ 2823 Sliding Window(单调队列入门题)
Sliding Window Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 67218 Accepted: 190 ...
随机推荐
- javaIO系统----再看装饰者模式
javaIO系统拥有各种各样的类,尤其是每次要进行读写操作时,总会一层套一层的new,以前不明白为什么要这样做,不过学习了适配器模式后,对于这种做法立刻了解了:动态扩展IO的功能,使之符合使用者的习惯 ...
- AngularJs的UI组件ui-Bootstrap分享(十三)——Progressbar
进度条控件有两种指令,第一种是uib-progressbar指令,表示单一颜色和进度的一个进度条.第二种是uib-bar和uib-progress指令,表示多种颜色和多个进度组合而成的一个进度条. 这 ...
- 在WPF中获取DataGridTemplateColumn模板定义的内容控件
xaml格式描述: <DataGrid Name="dataGrid" Grid.Row="1" ItemsSource="{Binding}& ...
- GreenDao数据库框架的配置与增删改查
并非原创,原创地址http://blog.csdn.net/njweiyukun/article/details/51893092 配置-------------------------------- ...
- oracle:ORACLE 实际返回的行数超出请求的行数
写的存储过程,执行后一直报实际返回的行数超出请求的行数的错误. 原因:select prdt_id into prdt_id from.... 两个变量名称相同造成的..哎 第一个变量换成大写..问 ...
- Unity在PC上创建Excel文档
NPOI下载连接:http://pan.baidu.com/s/1qWoITRI
- Liunx的各种小指令
tsshutdown -y ----关闭所有服务tsboot -g COMMON ----启动公共服务tsboot -g ETXX ----启动XX服务 tsma -e oet1 -l 172.X ...
- 虚机centos和本机Windows之间文件的拷贝无法用xftp时用FileZilla也行
步骤如下: 1.如果Centos没有安装ssh,则需要先安装: 2.查看虚拟机中IP地址,命令如下: ifconfig 3.在windows中安装ftp软件 FileZilla启动软件如图: 6 这 ...
- Redis 常用链接
安装部署 http://www.linuxidc.com/Linux/2014-05/101979.htm 更改访问权限配置(如密码,可访问地址):http://www.jb51.net/articl ...
- HDU4010 (动态树)
Problem Query on The Trees 题目大意 给一棵树,有点权,要求维护4种操作. 操作1:加一条边. 操作2:删一条边. 操作3:将一条路径上的点权增加w. 操作4:询问一条路径上 ...