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. 重新想象 Windows 8.1 Store Apps (72) - 新增控件: AppBar, CommandBar

    [源码下载] 重新想象 Windows 8.1 Store Apps (72) - 新增控件: AppBar, CommandBar 作者:webabcd 介绍重新想象 Windows 8.1 Sto ...

  2. SqlServer常用语句参考

    1.SQL SERVER中如何使用SQL 语句复制表结构: select * into 新表 from 旧表 where 1=2 把“旧表”的表结构复制到“新表”,1=2不复制数据,如果要复制数据,就 ...

  3. 世界上不存在什么RedBSD,SuseBSD或者ArchBSD,Turb...

    世界上不存在什么RedBSD,SuseBSD或者ArchBSD,TurboBSD之类的东西.

  4. JPA(7) spring-data-jpa

    对于不是使用spring管理的项目,我们就自己创建对象使用:大概的思路就是①创建dao接口②实现该接口,并且编写逻辑: Dao: public interface StudentDao { publi ...

  5. 小白学Linux(二)--命令行基本操作

    安装完Ubuntu后,进入系统,呈现在眼前的是Ubuntu的界面,跟windows的差不太多.一般操作系统包含GUI和CLI.GUI就是我们现在看到的,也是windows常用的直接用拖拽,点击等操作对 ...

  6. css样式reset

    初始化样式. @CHARSET "UTF-8"; body,ur,ol,li,p,h1,h2,h3,h4,h5,h6,form,fieldset,table,td,img,div, ...

  7. B/S和C/S的区别(转)

    一.什么是CS和BS结构? 1.C/S又称Client/Server或客户/服务器模式.服务器通常采用高性能的PC.工作站或小型机,并采用大型数据库系统,如Oracle.Sybase.Informix ...

  8. 单例(Singleton pattern)模式的七种写法

    转载请注明出处:http://www.cnblogs.com/smbk/ One: public class Singleton { private static Singleton instance ...

  9. Atitit.木马病毒的免杀原理---sikuli 的使用

    Atitit.木马病毒的免杀原理---sikuli 的使用 1. 使用sikuli java api1 1.1. 3. Write code!1 2. 常用api2 2.1. wait 等待某个界面出 ...

  10. android Java BASE64编码和解码二:图片的编码和解码

    1.准备工作 (1)在项目中集成 Base64 代码,集成方法见第一篇博文:android Java BASE64编码和解码一:基础 (2)添加 ImgHelper 工具类 package com.a ...