POJ 2823:Sliding Window 单调队列
Time Limit: 12000MS | Memory Limit: 65536K | |
Total Submissions: 48930 | Accepted: 14130 | |
Case Time Limit: 5000MS |
Description
moves rightwards by one position. Following is an example:
The array is [1 3 -1 -3 5 3 6 7], and k is 3.
Window position | Minimum value | Maximum value |
---|---|---|
[1 3 -1] -3 5 3 6 7 | -1 | 3 |
1 [3 -1 -3] 5 3 6 7 | -3 | 3 |
1 3 [-1 -3 5] 3 6 7 | -3 | 5 |
1 3 -1 [-3 5 3] 6 7 | -3 | 5 |
1 3 -1 -3 [5 3 6] 7 | 3 | 6 |
1 3 -1 -3 5 [3 6 7] | 3 | 7 |
Your task is to determine the maximum and minimum values in the sliding window at each position.
Input
Output
Sample Input
8 3
1 3 -1 -3 5 3 6 7
Sample Output
-1 -3 -3 -3 3 3
3 3 5 5 6 7
题意很好理解,就是对一个长度为n的数组,有一个大小为k的窗口不断向右移动,找出这个窗口中的最小值和最大值。
单调队列,如果是求最小值的话:满足两个条件,一个是队列中的元素从左至右 是从小到大的关系,保证从队头中提取出来的元素是最小值。求最大值则相反。
然后是队列的位置关系,要保证每一时刻队头的位置是最先淘汰的,其实这个不用去刻意保证,只要是从左扫到右,最先进来的元素肯定是最新鲜的元素,即后面位置的元素,只需满足head<=tail,就可以满足当p[head]在窗口外面时,只需head++的条件了。
代码:
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#pragma warning(disable:4996)
using namespace std; #define maxn 1000005
int A[maxn];//存储数据
int Q[maxn];//队列
int P[maxn];//存储A[i]中的下标i
int Min[maxn];//输出最小
int Max[maxn];//输出最大
int n,k,num; void get_min()
{
int i;
int head=1,tail=0;
num=0;
for(i=0;i<k-1;i++)
{
while(head<=tail && Q[tail]>=A[i])
{
tail--;
}
Q[++tail]=A[i];
P[tail]=i;
//while(head<i-k+1&&head<=tail)
// head++;
}
for(;i<n;i++)
{
while(head<=tail &&Q[tail]>=A[i])
{
tail--;
}
Q[++tail]=A[i];
P[tail]=i;
while(P[head]<i-k+1&&head<=tail)
head++;
Min[num++]=Q[head];
}
} void get_max()
{
int i;
int head=1,tail=0;
num=0;
for(i=0;i<k-1;i++)
{
while(head<=tail && Q[tail]<= A[i])
{
tail--;
}
Q[++tail]=A[i];
P[tail]=i;
//while(head<i-k+1&&head<=tail)
// head++;
}
for(;i<n;i++)
{
while(head<=tail &&Q[tail] <= A[i])
{
tail--;
}
Q[++tail]=A[i];
P[tail]=i;
while(P[head]<i-k+1&&head<=tail)
head++;
Max[num++]=Q[head];
}
} int main()
{
//freopen("i.txt","r",stdin);
//freopen("o.txt","w",stdout); int i;
scanf("%d%d",&n,&k); for(i=0;i<n;i++)
{
scanf("%d",A+i);
}
get_min();
for(i=0;i<num;i++)
{
if(i==0)
{
printf("%d",Min[i]);
}
else
{
printf(" %d",Min[i]);
}
}
printf("\n"); get_max();
for(i=0;i<num;i++)
{
if(i==0)
{
printf("%d",Max[i]);
}
else
{
printf(" %d",Max[i]);
}
}
printf("\n");
//system("pause");
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
POJ 2823:Sliding Window 单调队列的更多相关文章
- POJ 2823 Sliding Window + 单调队列
一.概念介绍 1. 双端队列 双端队列是一种线性表,是一种特殊的队列,遵守先进先出的原则.双端队列支持以下4种操作: (1) 从队首删除 (2) 从队尾删除 (3) 从队尾插入 (4) ...
- poj 2823 Sliding Window (单调队列入门)
/***************************************************************** 题目: Sliding Window(poj 2823) 链接: ...
- POJ 2823 Sliding Window (单调队列)
单调队列 加了读入挂比不加更慢.... 而且这份代码要交c++ 有大神G++跑了700ms..... orzorzorz #include<iostream> #include<cs ...
- poj 2823 Sliding Windows (单调队列+输入输出挂)
Sliding Window Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 73426 Accepted: 20849 ...
- POJ 2823 Sliding Window 题解
POJ 2823 Sliding Window 题解 Description An array of size n ≤ 106 is given to you. There is a sliding ...
- 洛谷P1886 滑动窗口(POJ.2823 Sliding Window)(区间最值)
To 洛谷.1886 滑动窗口 To POJ.2823 Sliding Window 题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每 ...
- POJ 2823 Sliding Window(单调队列入门题)
Sliding Window Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 67218 Accepted: 190 ...
- POJ 2823 Sliding Window 【单调队列】
题目链接:http://poj.org/problem?id=2823 题目大意:给出一组数,一个固定大小的窗体在这个数组上滑动,要求出每次滑动该窗体内的最大值和最小值. 这就是典型的单调队列,单调队 ...
- 【单调队列】poj 2823 Sliding Window
http://poj.org/problem?id=2823 [题意] 给定一个长度为n的序列,求长度为k的滑窗内的最大值和最小值 [思路] 裸的单调队列 注意用C++提交,不然会T,orz我用G++ ...
- 题解报告:poj 2823 Sliding Window(单调队列)
Description An array of size n ≤ 106 is given to you. There is a sliding window of size k which is m ...
随机推荐
- Python - Mro
参考 https://stackoverflow.com/questions/2010692/what-does-mro-do http://python.jobbole.com/85685/ 问题: ...
- 笔记||Python3进阶之调用外部程序
像wget可以下载文件 ffmpeg可以切割.合并.转换.录制视频 free命令可以查看linux内存使用信息 python提供了库来调用外部程序.命令?> 最常见的两种方法: ①o ...
- python正则表达式错误集
这篇博文主要记载一些个人的(python)正则表达式的常见错误以及误区,所以,不一定全面,不一定具有权威.但我会把每个例子列出来,争取用事实说话. 大括号中空格问题 In [15]: re.match ...
- jmeter实现文件下载
通过浏览器下载文件时,会提示选择保存路径,但是利用测试工具jmeter请求时,在页面看到请求次数是增加了,而本地没有具体下载下来的文件. 需要在具体的文件下载请求下面,添加后置处理器-bean she ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 表单:表单帮助文本
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Laradock 下安装Beast扩展
laradock/php-fpm/Dockfile ########################################################################## ...
- 第1节 kafka消息队列:1、kafka基本介绍以及与传统消息队列的对比
1. Kafka介绍 l Apache Kafka是一个开源消息系统,由Scala写成.是由Apache软件基金会开发的一个开源消息系统项目. l Kafka最初是由LinkedIn开发,并于20 ...
- 全文索引-ElasticSearch
ElasticSearch 官方文档 Elasticsearch是一个开源的搜索引擎,建立在一个全文搜索引擎库Apache Lucene™基础之上. Lucene可以说是当下最先进,高性能,全功能的搜 ...
- 使用redis集群中遇到的错误
一. 上述错误的原因: 1.在redis服务器上关闭防火墙 2.可能是host写错了 上述错误的原因: 配置文件中jedisClient代表的是单机版的redis,但是在类中转化的时候转化的是集群版
- Deepctr框架代码阅读
DeepCtr是一个简易的CTR模型框架,集成了深度学习流行的所有模型,适合学推荐系统模型的人参考. 我在参加比赛中用到了这个框架,但是效果一般,为了搞清楚原因从算法和框架两方面入手.在读代码的过程中 ...