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. alter语法的简单的使用

    用alter语法来新增列名,修改列名,删除列

  2. 线段树——Ultra-QuickSort

    题目网址:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=109331#problem/A Description In this prob ...

  3. TCMalloc优化MySQL、Nginx内存管理

    TCMalloc的全称为Thread-Caching Malloc,是谷歌开发的开源工具google-perftools中的一个成员. 与标准的glibc库的Malloc相比,TCMalloc库在内存 ...

  4. Linux命令详解之–ls命令

    今天开始为大家介绍下Linux中常用的命令,首先给大家介绍下Linux中使用频率最高的命令--ls命令. 更多Linux命令详情请看:Linux命令速查手册 linux ls命令用于显示指定工作目录下 ...

  5. c# Sqlite帮助类

    最近有WPF做客户端,需要离线操作存储数据,在项目中考虑使用Sqlite嵌入式数据库,在网上找了不少资料,最终整理出一个公共的帮助类. Sqlite是一个非常小巧的数据库,基本上具备关系型数据库操作的 ...

  6. android Adapter剖析理解

    UI控件都是跟Adapter(适配器)打交道的 Adapter: 是用来帮助控件填充数据的中间桥梁 (在开发中大多数Textview控件的内容是依靠数据库传递并显示的如:新闻类) Adapter: 将 ...

  7. GP的使用心得

    在ArcEngine时,GP无疑是GIS开发者的神器.自ArcEngine9.2开始新增一个程序集ESRI.ArcGIS.Geoprocessor,它能调用包含扩展模块在内的所有Geoprocessi ...

  8. GTD3年来读的52本书

    2012年   1.一生的计划 平衡:人生要在精神.理财.教育和娱乐4个方面进行平衡.   2.重来REWORK 小型软件公司的创业与软件项目的管理 不要管全年计划,只要找出下一项最重要的任务,然后起 ...

  9. Sharepoint学习笔记—习题系列--70-573习题解析 -(Q22-Q24)

    Question22You create a Feature.You need to remove the link to the Site Content Type page from the Si ...

  10. 迭代器iterator(三):Listlterator遍历arraylist,并用逆序输出结果

    迭代器(iterator) 是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址.迭代器修改了常规指针的接口,所谓迭代器是一种概 念上的抽象:那些行为上像迭 ...