题目传送门

题意:给你一个长度为n的数列,然后用一个长度为k的窗口去框(k<n)每次保存k这个窗口中的最大值和最小值,输出。

思路:这道题最朴素的on2的做法铁定超时,然后我想过一个nlogn的方法,网上有人说可以过,但我t了,当时队里的学长讲了单调队列这个知识点,现在才补了题。思路其实很简单,代码有注释,草稿纸准备好,直接看吧。

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstdlib>
  4. #include<sstream>
  5. #include<cstring>
  6. #include<bitset>
  7. #include<cstdio>
  8. #include<string>
  9. #include<deque>
  10. #include<stack>
  11. #include<cmath>
  12. #include<queue>
  13. #include<set>
  14. #include<map>
  15. #define INF 0x3f3f3f3f
  16. #define CLR(x,y) memset(x,y,sizeof(x))
  17. #define LC(x) (x<<1)
  18. #define RC(x) ((x<<1)+1)
  19. #define MID(x,y) ((x+y)>>1)
  20. using namespace std;
  21. typedef pair<int,int> pii;
  22. typedef long long ll;
  23. const double PI=acos(-1.0);
  24. const int maxn=1e6+10;
  25. int fact[10]= {1,1,2,6,24,120,720,5040,40320,362880};
  26. struct dian {
  27. int val,pos;//值 位置
  28. };
  29. dian maxque[maxn],minque[maxn];//结构体模拟队列
  30. int maxhead,maxtail,minhead,mintail;//递减队列(max) 头 尾 递增(max) 头 尾
  31. int maxans[maxn],minans[maxn];//输出的答案
  32. int main() {
  33. int n,k;
  34. cin>>n>>k;
  35. int x;
  36. for(int i=0; i<k; i++) {
  37. scanf("%d",&x);
  38. while(maxhead<maxtail&&maxque[maxtail-1].val<=x)maxtail--;//如果前一个小于当前输入的 那当窗口从前向后移动时 肯定是选择当前这个大的值,所以前面小的就不需要保存了
  39. maxque[maxtail].val=x;
  40. maxque[maxtail++].pos=i;//记录位置 为之后窗口的移动做准备
  41. while(minhead<mintail&&minque[mintail-1].val>=x)mintail--;//同理
  42. minque[mintail].val=x;
  43. minque[mintail++].pos=i;
  44. }
  45. int cur=1;
  46. for(int i=k; i<n; i++) {
  47. minans[cur]=minque[minhead].val;//记录答案 队列头保存的是最小的值
  48. maxans[cur++]=maxque[maxhead].val;
  49. scanf("%d",&x);
  50. while(maxhead < maxtail && maxque[maxhead].pos <= i-k)maxhead++;//窗口移动后 位置不符合要求的pop出去
  51. while(maxhead < maxtail && maxque[maxtail-1].val <= x)maxtail--;//对值进行之前做过的判断
  52. maxque[maxtail].val=x;
  53. maxque[maxtail++].pos=i;
  54. while(minhead < mintail && minque[minhead].pos <= i-k)minhead++;//同理
  55. while(minhead < mintail && minque[mintail-1].val >= x)mintail--;
  56. minque[mintail].val=x;
  57. minque[mintail++].pos=i;
  58. }
  59. minans[cur]=minque[minhead].val;
  60. maxans[cur++]=maxque[maxhead].val;
  61. for (int i = 1; i < cur; ++i) {
  62. if (i > 1) putchar(' ');
  63. printf("%d", minans[i]);
  64. }
  65. printf("\n");
  66. for (int i = 1; i < cur; ++i) {
  67. if (i > 1) putchar(' ');
  68. printf("%d", maxans[i]);
  69. }
  70. printf("\n");
  71. }
Sliding Window
Time Limit: 12000MS   Memory Limit: 65536K
Total Submissions: 67150   Accepted: 19065
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

  1. 8 3
  2. 1 3 -1 -3 5 3 6 7

Sample Output

  1. -1 -3 -3 -3 3 3
  2. 3 3 5 5 6 7

poj2823滑动窗口(单调队列)的更多相关文章

  1. [POJ2823]Sliding Window 滑动窗口(单调队列)

    题意 刚学单调队列的时候做过 现在重新做一次 一个很经典的题目 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗 ...

  2. POJ 2823 滑动窗口 单调队列

    https://vjudge.net/problem/POJ-2823 中文:https://loj.ac/problem/10175 题目 给一个长度为 $N$ 的数组,一个长为 $K$ 的滑动窗体 ...

  3. luoguP1886 滑动窗口 [单调队列]

    题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...

  4. [洛谷P1886]滑动窗口 (单调队列)(线段树)

    ---恢复内容开始--- 这是很好的一道题 题目描述: 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口. 现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的 ...

  5. [Luogu P1886]滑动窗口--单调队列入门

    题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...

  6. AcWing 154. 滑动窗口 单调队列

    地址 https://www.acwing.com/problem/content/description/156/ 输入格式 输入包含两行. 第一行包含两个整数n和k,分别代表数组长度和滑动窗口的长 ...

  7. 洛谷 P1886 滑动窗口(单调队列)

    题目链接 https://www.luogu.org/problemnew/show/P1886 题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始 ...

  8. cogs 495. 滑动窗口 单调队列

    495. 滑动窗口 ★★   输入文件:window.in   输出文件:window.out   简单对比时间限制:2 s   内存限制:256 MB [问题描述] 给你一个长度为N的数组,一个长为 ...

  9. POJ 2823 滑动窗口 单调队列模板

    我们从最简单的问题开始: 给定一个长度为N的整数数列a(i),i=0,1,...,N-1和窗长度k. 要求: f(i) = max{a(i-k+1),a(i-k+2),..., a(i)},i = 0 ...

  10. Acwing 154 滑动窗口(单调队列)经典模板

    给定一个大小为n≤106n≤106的数组. 有一个大小为k的滑动窗口,它从数组的最左边移动到最右边. 您只能在窗口中看到k个数字. 每次滑动窗口向右移动一个位置. 以下是一个例子: 该数组为[1 3 ...

随机推荐

  1. Aborted connection+druid

    试一试setTimeBetweenEvictionRunsMillis +setMaxEvictableIdleTimeMillis小于 mysql的wait_timeout

  2. 【275】◀▶ Python 控制语句说明

    参考:Python循环语句 01   for 循环语句. 02   while 循环语句. 03   if...else 选择语句. 04   continue 执行循环语句中的下一条循环. 05   ...

  3. ruby 变量和方法

    def say_goodnight(name) result ="Good night ." +name return result end def say_goodmorning ...

  4. php学习笔记-默认参数

    在定义函数的时候,我们可以把其中的一个参数变的特殊起来,使它有一个默认值,这个参数就叫默认参数.在调用这个函数的时候,你既可以给这个默认参数传递一个值,这样的话默认参数的值会被覆盖掉,也可以不给它传递 ...

  5. tomcat8.0的下载安装配置

    配置tomcat前要先配置JDK的环境变量 具体方法请点链接JDK环境变量配置 首先要 到官网下载tomcat tomcat官网 进入官网后 如图在左侧选择自己想要下载的版本,这里我以8.0版本为例 ...

  6. c++调用shell命令

    system()这个函数就不说了,不能读取返回值. #include<cstdio> int main() { FILE *fp; ]={}; fp=popen("ssh roo ...

  7. WordCount编码和测试

    WordCount编码和测试 项目地址:https://github.com/handsomesnail/WordCount PSP表格 PSP2.1 PSP阶段 预估耗时(分钟) 实际耗时(分钟) ...

  8. Ubuntu16.04版安装VMwareTools的步骤和没法挂载目录问题的解决

    vmtool安装流程 1.点击vmware 里面的虚拟机——>安装vmware tool 2.然后(等待一会)弹出一个界面把里面的 VMwareTools-9.6.1-1378637.tar.g ...

  9. 让 Winform 窗口悬浮的简单方式

    很多次设置这个 TopMost 属性会莫名的不起作用,有时又可以.一直在想是为什么会这样? 后来多次尝试,发现这个属性必须在窗体某些其他属性后设置,比如在 Height.Width 这样的属性后. 看 ...

  10. android studio中使用recyclerview小白篇(一)

    本人就是小白,昨天在使用listview时,看到说有更好的控件出来了,在V7包中,需要SDK21及以上,那就试着用用吧,今天试了一天,终于弄的能简单使用了,分享一下. 怎么导入这个recycleyvi ...