题目描述

给你一个长度为 N 的数组,一个长为 K 的滑动的窗体从最左移至最右端,你只能见到窗口的 K 个整数,每次窗体向右移动一位,如下表:

aaarticlea/png;base64,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" alt="" />

你的任务是找出窗口在各位置时的最大值和最小值。

输入格式

输入的第 1 行是两个整数 n,k,第 2 行为长度为 n 的数组(即有 n 个整数)。

输出格式

输出 2 行,第 1 行是每个位置的最小值,第 2 行是每个位置的最大值。

样例数据 1

输入  [复制]

8 3 
1 3 -1 -3 5 3 6 7

输出

-1 -3 -3 -3 3 3 
3 3 5 5 6 7

备注

【数据范围】

对于 20% 的数据:n<=500;
对于 50% 的数据:n<=100000;
对于 100% 的数据:n<=1000000;

题目分析

入门级别单调队列。分别维护一个单调递增和单调递减的队列,每次添加新数并维护单调性,然后删除队首的在区间外面的数,最后队首就是答案。

code

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std; const int N = , oo = 0x3f3f3f3f;
typedef pair<int, int> P;
int data[N], head, tail, n, k;
P que[N]; inline int read(){
int i = , f = ; char ch = getchar();
for(; (ch < '' || ch > '') && ch != '-'; ch = getchar());
if(ch == '-') f = -, ch = getchar();
for(; ch >= '' && ch <= ''; ch = getchar())
i = (i << ) + (i << ) + (ch - '');
return i * f;
} inline void wr(int x){
if(x < ) putchar('-'), x = -x;
if(x > ) wr(x / );
putchar(x % + '');
} int main(){
n = read(), k = read();
for(int i = ; i <= n; i++) data[i] = read();
tail = head = ;
que[head].second = oo;
for(int i = ; i <= n; i++){
if(data[i] < que[head].second)
que[head = tail = ] = P(i, data[i]);
else{
while(head < tail && que[tail].second > data[i]) tail--;
que[++tail] = P(i, data[i]);
}
while(que[head].first <= i - k) head++;
if(i >= k)
wr(que[head].second), putchar(' ');
// cout<<endl<<"!!";for(int j = head; j <= tail; j++) cout<<"("<<que[j].first<<") "<<que[j].second<<" ";cout<<endl;
}
putchar('\n');
tail = head = ;
que[head].second = -oo;
for(int i = ; i <= n; i++){
if(data[i] > que[head].second)
que[head = tail = ] = P(i, data[i]);
else{
while(head < tail && que[tail].second < data[i]) tail--;
que[++tail] = P(i, data[i]);
}
while(que[head].first <= i - k) head++;
if(i >= k)
wr(que[head].second), putchar(' ');
// cout<<endl<<"!!";for(int j = head; j <= tail; j++) cout<<que[j].first<<" "<<que[j].second<<" ";cout<<endl;
}
return ;
}

【Sliding Window】单调队列的更多相关文章

  1. POJ 2823 Sliding Window + 单调队列

    一.概念介绍 1. 双端队列 双端队列是一种线性表,是一种特殊的队列,遵守先进先出的原则.双端队列支持以下4种操作: (1)   从队首删除 (2)   从队尾删除 (3)   从队尾插入 (4)   ...

  2. poj 2823 Sliding Window (单调队列入门)

    /***************************************************************** 题目: Sliding Window(poj 2823) 链接: ...

  3. POJ2823 Sliding Window(单调队列)

    单调队列,我用deque维护.这道题不难写,我第二次写单调队列,1次AC. -------------------------------------------------------------- ...

  4. POJ 2823:Sliding Window 单调队列

    Sliding Window Time Limit: 12000MS   Memory Limit: 65536K Total Submissions: 48930   Accepted: 14130 ...

  5. POJ 2823 Sliding Window (单调队列)

    单调队列 加了读入挂比不加更慢.... 而且这份代码要交c++ 有大神G++跑了700ms..... orzorzorz #include<iostream> #include<cs ...

  6. POJ 2823 UESTCoj 1221 Sliding Window 单调队列 经典入门题

    题意:给出一个序列,求出每连续k个数字中最大的数和最小的数. 这是道单调队列裸题,直接写就行了. 本来用deque写出来后,发现在poj上硬是超时了,在discuss上看很多人也在抱怨超时的问题,据说 ...

  7. poj 2823 Sliding Windows (单调队列+输入输出挂)

    Sliding Window Time Limit: 12000MS   Memory Limit: 65536K Total Submissions: 73426   Accepted: 20849 ...

  8. poj2823Sliding Window——单调队列

    题目:http://poj.org/problem?id=2823 单调队列模板. 代码如下: #include<iostream> #include<cstdio> usin ...

  9. 【t019】window(单调队列)

    Time Limit: 2 second Memory Limit: 256 MB [问题描述] 给你一个长度为N 的数组,一个长为K的滑动的窗体从最左移至最右端,你只能见到窗口的K个数,每次窗体向右 ...

  10. POJ2823 Sliding Window (单调队列)

    POJ2823 Sliding Window Time Limit: 12000MS   Memory Limit: 65536K Total Submissions: 38342   Accepte ...

随机推荐

  1. js进阶 13-11/12 jquery如何实现折叠导航

    js进阶 13-11/12 jquery如何实现折叠导航 一.总结 一句话总结:还是用的slideToggle滑动效果,并且这一个展开时,所有兄弟都关闭. 1.文字缩进怎么设置? 感觉设置margin ...

  2. UVA 11584 - Partitioning by Palindromes DP

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  3. poj1679 The Unique MST(判定次小生成树)

    The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 23180   Accepted: 8235 D ...

  4. JAVA一些基础概念

    Java (计算机编程语言) Java是一门面向对象编程语言,不仅吸收了C++语言的各种长处,还摒弃了C++里难以理解的多继承.指针等概念.因此Java语言具有功能强大和简单易用两个特征. Java语 ...

  5. java学习笔记之基础语法(二)

    1.数组: 概念:同一种类型数据的集合,其实,数组就是一个容器 优点:可以方便的对其进行操作,编号从0开始,方便操作这些元素. 2,数组的格式 元素类型[]数组名=new 元素类型[数组元素个数]: ...

  6. Altium Designer如何重命名文件

  7. iOS调试 - 基本技巧

    在程序中,无论是你想弄清楚为什么数组中有3个对象而不是5个,或者为什么一个新的玩家开始之后,游戏在倒退——调试在这些处理过程中是比较重要的一部 分.通过本文的学习,我们将知道在程序中,可以使用的大多数 ...

  8. [TypeScript] Understand lookup types in TypeScript

    Lookup types, introduced in TypeScript 2.1, allow us to dynamically create types based on the proper ...

  9. Android Wear之android穿戴式设备应用开发平台

    Android Wear于2014年03月19日公布,并有Moto 360和LG watch两款产品. 眼下源代码还没有开放.可是开发人员能够下载它的Image及相应的开发SDK,这样开发人员通过模拟 ...

  10. 【Heritrix基础教程之1】在Eclipse中配置Heritrix 分类: H3_NUTCH 2014-06-01 00:00 1262人阅读 评论(0) 收藏

    一.新建项目并将Heritrix源码导入 1.下载heritrix-1.14.4-src.zip和heritrix-1.14.4.zip两个压缩包,并解压,以后分别简称SRC包和ZIP包: 2.在Ec ...