题目大意

给定一行数,共N个。有一个长度为K的窗口从左向右滑动,窗口中始终有K个数字,窗口每次滑动一个数字。求各个时刻窗口中的最大值和最小值。

题目分析

直接搜索,复杂度为O(n^2)。考虑使用单调队列,单调队列中的元素(或者元素的相关信息)单调递增或者递减。在本题中用一个单调递增的队列A保存当前窗口中值逐渐递增的索引,队列的头部元素为当前窗口中的最小值的索引;用一个单调递减的队列B保存当前窗口中值逐渐递减的索引,队列的头部元素为当前窗口中最大值的索引。 
    窗口每移动到一个新的元素ele时,若新元素大于A中的队尾元素,则入队列,否则,不断弹出队尾的元素,直到队尾元素小于ele,然后入队;若新元素小于B的队尾元素,则入队列,否则,不断弹出队尾元素,直到队尾元素大于ele,然后入队。 
    若窗口移动到的最新元素的index - 队列头元素(队列中存放的是索引) > 窗口长度k,则队列头部后移,以保证队列中的索引位于窗口之内。 
    每个元素最多入栈2次,出栈2次,平摊复杂度为O(n).

    单调队列/栈中存放的一般为序列元素的索引(可能还有其他更多信息),且每次新元素和队尾/栈顶元素比较,若满足单调性质,则入队/入栈;否则,不断弹出队尾/栈顶元素,直到满足单调性质,再入队/入栈。 
    有时可能还需要考虑栈和队列的size(如本题中的窗口)

实现(c++)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define MAX_SIZE 1000005
int gMaxInWindow[MAX_SIZE];
int gMinInWindow[MAX_SIZE];
int gIncQ[MAX_SIZE];
int gDecQ[MAX_SIZE];
int gArray[MAX_SIZE];
int main(){
int n, k;
scanf("%d %d", &n, &k);
int inc_front = 0, inc_tail = -1, dec_front = 0, dec_tail = -1;
int ele;
for (int i = 0; i < n; i++){
scanf("%d", &ele);
gArray[i] = ele; while (inc_tail >= inc_front && gArray[gIncQ[inc_tail]] >= ele){
inc_tail--;
}
inc_tail++;
gIncQ[inc_tail] = i; while (dec_tail >= dec_front && gArray[gDecQ[dec_tail]] <= ele){
dec_tail--;
}
dec_tail++;
gDecQ[dec_tail] = i; if (i - gIncQ[inc_front] >= k){
inc_front++;
}
if (i - gDecQ[dec_front] >= k){
dec_front++;
}
if (i >= k - 1){
gMinInWindow[i - k + 1] = gArray[gIncQ[inc_front]];
gMaxInWindow[i - k + 1] = gArray[gDecQ[dec_front]];
}
}
for (int i = 0; i <= n - k; i++){
printf("%d ", gMinInWindow[i]);
}
printf("\n");
for (int i = 0; i <= n - k; i++){
printf("%d ", gMaxInWindow[i]);
} return 0;
}

poj_2823 单调队列的更多相关文章

  1. BestCoder Round #89 B题---Fxx and game(单调队列)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5945     问题描述 输入描述 输出描述 输入样例 输出样例 题意:中文题,不再赘述: 思路:  B ...

  2. 单调队列 && 斜率优化dp 专题

    首先得讲一下单调队列,顾名思义,单调队列就是队列中的每个元素具有单调性,如果是单调递增队列,那么每个元素都是单调递增的,反正,亦然. 那么如何对单调队列进行操作呢? 是这样的:对于单调队列而言,队首和 ...

  3. FZU 1914 单调队列

    题目链接:http://acm.fzu.edu.cn/problem.php?pid=1914 题意: 给出一个数列,如果它的前i(1<=i<=n)项和都是正的,那么这个数列是正的,问这个 ...

  4. BZOJ 1047 二维单调队列

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1047 题意:见中文题面 思路:该题是求二维的子矩阵的最大值与最小值的差值尽量小.所以可以考 ...

  5. 【BZOJ3314】 [Usaco2013 Nov]Crowded Cows 单调队列

    第一次写单调队列太垃圾... 左右各扫一遍即可. #include <iostream> #include <cstdio> #include <cstring> ...

  6. BZOJ1047: [HAOI2007]理想的正方形 [单调队列]

    1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2857  Solved: 1560[Submit][St ...

  7. hdu 3401 单调队列优化DP

    Trade Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status ...

  8. 【转】单调队列优化DP

    转自 : http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列是一种严格单调的队列,可以单调递增,也可以单调递减.队 ...

  9. hdu3530 单调队列

    Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

随机推荐

  1. blender, knife工具

    点击Knife按钮开始切割,MLB在边上确认分割点,return键完成切割,MRB取消切割(这些在窗口下面的信息提示栏中都有写,如图中如示).

  2. 使用SOCKET实现TCP/IP协议的通讯

    一.原理: 首先要理解基本的原理,2台电脑间实现TCP通讯,首先要建立起连接,在这里要提到服务器端与客户端,两个的区别通俗讲就是主动与被动的关系,两个人对话,肯定是先有人先发起会话,要不然谁都不讲,谈 ...

  3. [Jobdu] 题目1507:不用加减乘除做加法

    题目描述: 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 输入: 输入可能包含多个测试样例.对于每个测试案例,输入为两个整数m和n(1<=m,n<=100 ...

  4. Sql 常用的语句实例与代码

    在学习SQL的时候,本来预计花三天的时候掌握MS SQL这些基础,现在争取提前一天看完.总结沉底下来,其实也没有多少东西: 1.程序初始化前,先连接数据库 MFC程序中添加记录的代码: [cpp] v ...

  5. [svc]entrypoint.sh shell脚本解析

    最近搞influxdb绘图,看到其dockerfile的entry.sh,无奈看的不是很懂. 于是查了下.. docker run 通过传参实现配置文件覆盖 实现启动镜像时候可指定配置文件 如果不指定 ...

  6. windows 添加打印机

    控制面板---->硬件和声音---->设备和打印机--->点击添加打印机 最后安驱动(选择通用) OK!

  7. Nginx设置expires设定页面缓存时间 不缓存或一直使用缓存

    配置expires expires起到控制页面缓存的作用,合理的配置expires可以减少很多服务器的请求 要配置expires,可以在http段中或者server段中或者location段中加入 l ...

  8. python用time函数计算程序运行时间

    内置模块time包含很多与时间相关函数.我们可通过它获得当前的时间和格式化时间输出. time(),以浮点形式返回自Linux新世纪以来经过的秒数.在linux中,00:00:00 UTC, Janu ...

  9. 示例 - 如何在NodeJS中调用SS生成的DLL

    要想在NodeJS中调用SS生成的DLL, 需要借助EdgeJS. EdgeJS: http://tjanczuk.github.io/edge/ 如果你还不知道如何在SS中生成DLL, 请查看: S ...

  10. HeadFirst Jsp 09 (JSTL)

    JSTL (jsp standard tag library) 标准标记库 JSTL 安装, 注意你的每一个项目都需要一个 JSTL副本, 并把它放在WEB-INF/lib 目录下, 在 Tomcat ...