题目描述

给你一个长度为 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. 00103_死锁、Lock接口、等待唤醒机制

    1.死锁 (1)同步锁使用的弊端:当线程任务中出现了多个同步(多个锁)时,如果同步中嵌套了其他的同步.这时容易引发一种现象:程序出现无限等待,这种现象我们称为死锁.这种情况能避免就避免掉: synch ...

  2. Java vs C++:子类覆盖父类函数时缩小可访问性的不同设计

    Java 和 C++ 都是面向对象的语言,允许对象之间的继承.两个语言的继承都设置有允许子类覆盖父类的“虚函数”,加引号是因为 Java 中没有虚函数这一术语,但是我们的确可以把 Java 的所有函数 ...

  3. Python Tricks(二十)—— 阶乘的极简实现

    使用 reduce # 比如计算 9 的阶乘 >> reduce(lambda x, y: x*y, range(1, 9+1)) 362880 当然这里的 reduce 直接返回具体的数 ...

  4. Web网站架构演变—高并发、大数据

    转 Web网站架构演变—高并发.大数据 2018年07月25日 17:27:22 gis_morningsun 阅读数:599   前言 我们以javaweb为例,来搭建一个简单的电商系统,看看这个系 ...

  5. Eclipse高效开发插件汇总

    以下是我整理的自己开发过程中的常用Eclipse插件,按字母排序: (1)    AmaterasUML         介绍:Eclipse的UML插件,支持UML活动图,class图,sequen ...

  6. Linq读取XML数据

    1.XML数据格式:<?xml version="1.0"?><customers>  <customer>    <id>ALFK ...

  7. MacBook Touch Bar 使用技巧

    MacBook Touch Bar 使用技巧 使用Clock Bar再Touch Bar上显示时间 在全屏显示的情况下无法看到时间,于是就想在Touch Bar上是否可以显示时间呢,系统好像没有相应的 ...

  8. Nginx content cache Nginx内容缓存

    原文地址:http://nginx.com/resources/admin-guide/caching/ Nginx content cache Nginx内容缓存 This chapter desc ...

  9. pstack.sh 改进版

    pstack.sh 改进版本 #!/bin/bash if (( $# < 1 )) ; then echo "usage: `basename $0` pid" 1> ...

  10. HtmlParser基础教程 分类: C_OHTERS 2014-05-22 11:33 1649人阅读 评论(1) 收藏

    1.相关资料 官方文档:http://htmlparser.sourceforge.net/samples.html API:http://htmlparser.sourceforge.net/jav ...