Sliding Window

Time Limit: 12000MS
Memory Limit: 65536K

Case Time Limit: 5000MS

Description

An array of size n ≤ 106 is given to you. There is a sliding window of size k which is moving from the very left of the array to the very right. You can only see the k numbers in the window. Each time the sliding window 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

The input consists of two lines. The first line contains two integers n and k which are the lengths of the array and the sliding window. There are n integers in the second line.

Output

There are two lines in the output. The first line gives the minimum values in the window at each position, from left to right, respectively. The second line gives the maximum values.

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
 
   1: #include <iostream>

   2: #include <cstdio>

   3: #include <cstring>

   4: #include <algorithm>

   5: using namespace std;

   6: #define lson l,m,rt<<1

   7: #define rson m+1,r,rt<<1|1

   8: typedef long long ll;

   9: const int maxn=1111111;

  10: int a[maxn<<2],b[maxn<<2];

  11: int small[maxn],big[maxn],cnt=0;

  12:  

  13: void PushUp(int rt)

  14: {

  15:     a[rt]=max(a[rt<<1],a[rt<<1|1]);

  16:     b[rt]=min(b[rt<<1],b[rt<<1|1]);

  17: }

  18:  

  19: void build(int l,int r,int rt)

  20: {

  21:     if(l==r){

  22:         scanf("%d",&a[rt]);

  23:         b[rt]=a[rt];

  24:         return;

  25:     }

  26:     int m=(l+r)>>1;

  27:     build(lson); build(rson);

  28:     PushUp(rt);

  29: }

  30:  

  31: void query(int L,int R,int l,int r,int rt,int &ma,int &mi)

  32: {

  33:     if(L<=l&&R>=r)

  34:     {

  35:         ma=a[rt];

  36:         mi=b[rt];

  37:         return;

  38:     }

  39:     int m=(r+l)>>1;

  40:     if(L<=m&&R>m)

  41:     {

  42:         int x1,y1,x2,y2;

  43:         query(L,R,lson,x1,y1);

  44:         query(L,R,rson,x2,y2);

  45:         ma=max(x1,x2);

  46:         mi=min(y1,y2);

  47:     }

  48:     else if(L<=m)

  49:         query(L,R,lson,ma,mi);

  50:     else

  51:         query(L,R,rson,ma,mi);

  52: }

  53:  

  54: void show(int n,int e[])

  55: {

  56:     for(int i=0; i<n ; i++){

  57:         if(i) printf(" ");

  58:         printf("%d",e[i]);

  59:     }

  60:     printf("\n");

  61: }

  62:  

  63: void run(int n,int k)

  64: {

  65:     cnt=0;

  66:     build(1,n,1);

  67:     for(int i=k; i<=n; i++)

  68:     {

  69:         query(i-k+1,i,1,n,1,big[cnt],small[cnt]);

  70:         cnt++;

  71:     }

  72:     show(cnt,small);

  73:     show(cnt,big);

  74: }

  75:  

  76: int main()

  77: {

  78:     int n,k;

  79:     while(scanf("%d%d",&n,&k)!=EOF)

  80:         run(n,k);

  81:     return 0;

  82: }

 

POJ 2823 Sliding Window的更多相关文章

  1. POJ 2823 Sliding Window + 单调队列

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

  2. POJ 2823 Sliding Window 题解

    POJ 2823 Sliding  Window 题解 Description An array of size n ≤ 106 is given to you. There is a sliding ...

  3. 洛谷P1886 滑动窗口(POJ.2823 Sliding Window)(区间最值)

    To 洛谷.1886 滑动窗口 To POJ.2823 Sliding Window 题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每 ...

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

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

  5. POJ 2823 Sliding Window ST RMQ

    Description An array of size n ≤ 106 is given to you. There is a sliding window of size k which is m ...

  6. POJ 2823 Sliding Window(单调队列入门题)

      Sliding Window Time Limit: 12000MS   Memory Limit: 65536K Total Submissions: 67218   Accepted: 190 ...

  7. POJ 2823 Sliding Window & Luogu P1886 滑动窗口

    Sliding Window Time Limit: 12000MS   Memory Limit: 65536K Total Submissions: 66613   Accepted: 18914 ...

  8. POJ - 2823 Sliding Window (滑动窗口入门)

    An array of size n ≤ 10 6 is given to you. There is a sliding window of size kwhich is moving from t ...

  9. POJ 2823 Sliding Window (滑动窗口的最值问题 )

    Sliding Window Time Limit: 12000MS   Memory Limit: 65536K Total Submissions: 41264   Accepted: 12229 ...

随机推荐

  1. VC包含目录、附加依赖项、库目录及具体设置

    包含目录:#include <headerfile.h>中headerfile.h的搜索目录.如果有XXX.h找不到,设置这个目录可以解决. 附加依赖项:C++的库会把函数.类的声明放在* ...

  2. C#客户端Redis服务器的分布式缓存

    介绍 在这篇文章中,我想介绍我知道的一种最紧凑的安装和配置Redis服务器的方式.另外,我想简短地概述一下在.NET / C#客户端下Redis hash(哈希类型)和list(链表)的使用. 在这篇 ...

  3. Unity多语言本地化改进版

    简介 之前捣鼓过一个通过csv配置游戏多语言支持的小工具,但是发现使用过程中,通过notepad++去进行转码很不方便,并且直接将配置的csv不加密的放在游戏中心里感觉不是很踏实 于是乎~~ 新的方案 ...

  4. Javascript语法去控制Web控件的Enabled属性

    Web控件当使用Enabled属性时,它生成html之后会变成了disabled了.我们为了能够在javascript去控制控件的禁用与启用,得从这个disabled入手.如:

  5. Dev TreeList设置焦点失败解决方法

    问题描述 对TreeList初始化之后,设置treelist的焦点节点时,发现每次初始化控件的时不能正确的绑定焦点节点,第二次点开treelist的时候才会正常的设置目标节点为焦点节点. 截图 解决方 ...

  6. .NET初学者推荐课程 asp.net错误代码大全

    错误 CS0001 编译器内部错误错误 CS0003 内存溢出错误 CS0004 提升为错误的警告错误 CS0005 编译器选项后应跟正确的参数错误 CS0006 找不到动态链接的元数据文件错误 CS ...

  7. 【CODEVS 3287】【NOIP2013】火车运输

    http://codevs.cn/problem/3287/ 题目描述 国有 座城市,编号从 到 ,城市之间有 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 辆货车在运输货物, 司机们想 ...

  8. [moka同学笔记]一、Yii2.0课程笔记(魏曦老师教程)

    第一节   第二节             课程内容     

  9. C语言范例学习03-中

    栈和队列 这两者都是重要的数据结构,都是线性结构.它们在日后的软件开发中有着重大作用.后面会有实例讲解. 两者区别和联系,其实总结起来就一句.栈,后进先出:队列,先进先出. 可以将栈与队列的存储空间比 ...

  10. Delphi又要换东家了

    前几天听到这个消息,搞个FMX出来,64位还没搞清楚,又开始折腾了!http://www.deltics.co.nz/blog/posts/2371 No Seriously – Let’s Buy ...