这是一道题意简单,数据较大的题(喜闻乐见);

一开始可能会想到RMQ问题,ST,线段树都是O(nlogn),应该勉强能过(没试过);

由于这道题区间是滚动连续的,所以,可以使用单调队列!

以最小值为例:

对于a[i],a[j],i>j;

如果a[i]<a[j],那么在加入i到滚动窗口中,找最小值一定不用考虑a[j];

因为a[j]比a[i]要先退出窗口,且即便i,j都在窗口中,那么a[j]一定不是最小值(a[i]<a[j]);

所以我们维护一个单调升序队列,对于新加入的元素,如果比队尾元素大,那么在队尾处入队(可能成为某个区间最小值);

否则的话,找打一个合适的位置m使之前位置的树比它小,后面的数比它大,同时将位置m后面的数全部退队;

由于单调队列是随着下标递增的,那么对于滚动窗口滚出的元素,从队头判断即可。

  1. var ans:array[..,..] of longint;
  2. a,w:array[..] of longint;
  3. h,f,r,mid,m,n,i,v:longint;
  4. begin
  5. readln(n,m);
  6. for i:= to n do
  7. read(a[i]);
  8. a[]:=-;
  9. for i:= to n do
  10. begin
  11. if a[i]>a[w[h]] then
  12. begin
  13. h:=h+;
  14. w[h]:=i;
  15. end
  16. else begin
  17. f:=;
  18. r:=h;
  19. repeat
  20. mid:=(f+r) div ;
  21. if (a[w[mid]]>=a[i]) and (a[w[mid-]]<a[i]) then break;
  22. if (a[w[mid]]>=a[i]) then r:=mid- else f:=mid+;
  23. until f>r;
  24. h:=mid;
  25. w[h]:=i;
  26. end;
  27. if i>=m then
  28. begin
  29. f:=;
  30. r:=h;
  31. v:=;
  32. repeat
  33. mid:=(f+r) div ;
  34. if w[mid]<i-m+ then f:=mid+;
  35. if w[mid]>=i-m+ then
  36. begin
  37. v:=mid;
  38. r:=mid-;
  39. end;
  40. until f>r;
  41. ans[i-m+,]:=a[w[v]];
  42. end;
  43. end;
  44. a[]:=;
  45. h:=;
  46. fillchar(w,sizeof(w),);
  47. for i:= to n do
  48. begin
  49. if a[i]<a[w[h]] then
  50. begin
  51. h:=h+;
  52. w[h]:=i;
  53. end
  54. else begin
  55. f:=;
  56. r:=h;
  57. repeat
  58. mid:=(f+r) div ;
  59. if (a[w[mid]]<=a[i]) and (a[w[mid-]]>a[i]) then break;
  60. if (a[w[mid]]<=a[i]) then r:=mid- else f:=mid+;
  61. until f>r;
  62. h:=mid;
  63. w[h]:=i;
  64. end;
  65. if i>=m then
  66. begin
  67. f:=;
  68. r:=h;
  69. v:=;
  70. repeat
  71. mid:=(f+r) div ;
  72. if w[mid]<i-m+ then f:=mid+;
  73. if w[mid]>=i-m+ then
  74. begin
  75. v:=mid;
  76. r:=mid-;
  77. end;
  78. until f>r;
  79. ans[i-m+,]:=a[w[v]];
  80. end;
  81. end;
  82. for i:= to n-m+ do
  83. write(ans[i,],' ');
  84. writeln;
  85. for i:= to n-m+ do
  86. write(ans[i,],' ');
  87. writeln;
  88. end.

单调队列,关键在于看出题目中的单调性;

还有单调队列一般存放标号比较方便

poj2823的更多相关文章

  1. 【poj2823】 Sliding Window

    http://poj.org/problem?id=2823 (题目链接) 题意 维护滑动窗口最大最小值. Solution sb单调队列 代码 // poj2823 #include<algo ...

  2. POJ2823 Sliding Window (单调队列)

    POJ2823 Sliding Window Time Limit: 12000MS   Memory Limit: 65536K Total Submissions: 38342   Accepte ...

  3. poj2823:单调队列入门题

    今天学习了一下单调队列这种数据结构,思想不是很难 参考资料:http://www.cnblogs.com/Jason-Damon/archive/2012/04/19/2457889.html 然后自 ...

  4. poj2823 单调队列初步

    什么是单调队列:头元素一直是队列当中的最大值,队列中的值按照递减顺序排列,可以从末尾插入一个元素,或从两段删除元素 1.插入元素,为了保证队列的单调性(这里假设为递减性),在插入元素v时要将对位的元素 ...

  5. 刷题向》POJ2823 单调队列裸题(<不会做,请自裁>系列)

    最近BZOJ炸了,而我的博客上又更新了一些基本知识,所以这里刷一些裸题,用以丰富知识性博客 POJ2823   滑动的窗口 这是一道经典的单调队题,我记得我刚学的时候就是用这道题作为单调队列的例题,算 ...

  6. poj2823/hdu3415 - 数据结构 单调队列

    poj2823 题目链接 长度为N的数组,求宽度k的滑动窗口在数组上滑动时窗口内的最大值或最小值 如果用单调队列做,求最小值时,队列应该严格递增的.所以插入时,队尾大于等于插入值的元素都应被舍弃,因为 ...

  7. POJ2823 单调队列

    POJ2823 http://poj.org/problem?id=2823 最基础的单调队列,说是数据结构,其实就是一种更新数组数据的方法. 之前还准备用deque,超时了,直接head,tail快 ...

  8. POJ2823 Sliding Window

    Time Limit: 12000MS   Memory Limit: 65536K Total Submissions: 53086   Accepted: 15227 Case Time Limi ...

  9. POJ2823 Sliding Window(单调队列)

    题目要输出一个序列各个长度k的连续子序列的最大值最小值. 多次RMQ的算法也是能过的,不过单调队列O(n). 这题,队列存元素值以及元素下标,队尾出队维护单调性然后入队,队首出队保持新元素下标与队首元 ...

  10. 双端队列(单调队列)poj2823 区间最小值(RMQ也可以)

    Sliding Window Time Limit: 12000MS   Memory Limit: 65536K Total Submissions: 41844   Accepted: 12384 ...

随机推荐

  1. mysql实例 保存查询结果到变量

    本文介绍下,一个mysql的例子,将查询到的数据结果保存到一个变量中.有需要的朋友可以参考下. 本代码演示: 将mysql查询结果保存到变量中的方法. 代码: view source print? 0 ...

  2. Spark小课堂Week3 FirstSparkApp(RDD开发)

    Spark小课堂Week3 FirstSparkApp 问题:Java有哪些数据结构 大致有如下几种,其中List与Map是最重要的: List Map Set Array Heap Stack Qu ...

  3. nodejs的模块系统(实例分析exprots和module.exprots)

    前言:工欲善其事,必先利其器.模块系统是nodejs组织管理代码的利器也是调用第三方代码的途径,本文将详细讲解nodejs的模块系统.在文章最后实例分析一下exprots和module.exprots ...

  4. redis参考

    www.redis.cn www.redis.io http://blog.nosqlfan.com/ 可以移步http://try.redis.io/进行实验命令 Redis 设计与实现(第一版) ...

  5. dive into python 读笔(3)

    chapter 6 异常和文件处理: # 使用 try...except 来捕捉异常 # 使用 try...finally 来保护额外的资源 # 读取文件 # 在一个 for循环中一次赋多个值 # 使 ...

  6. ANN中Precision-Recall权衡

    如果想要得到较高的精度,则需要较长的编码. 编码长度m增长的话,则item碰撞的概率会成倍的减小,从而导致召回率下降. 为了得到较高的召回率,则需要多个哈希表. 参考http://yongyuan.n ...

  7. 看几道JQuery试题后总结(下篇)

    感谢圆友的提醒 昨天下午完成了9道试题中的前4道,之后好多园友存在些疑惑和建议,在这里我一并说一下吧.首先对于昨天第一题可能存在误导,在JQuery中并没有innerHTML这个属性,不过我们可以将J ...

  8. Android 环境搭建 版本问题

    jdk1.6 1.7  eclipse 3.7.2    SDK-r12 ADT 12 SDK和ADT必须配套 搭建环境需要四个软件: 1.JDK(这是最新版本jdk1.7官方下载地址:http:// ...

  9. 【leetcode】Trapping Rain Water(hard)

    Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...

  10. 学点PYTHON基础的东东--数据结构,算法,设计模式---单向链表

    看来看来,还是以下这个实现最优雅.. 其它的,要么NODE冗余,要么初始化丑陋... #!/usr/bin/env python # -*- coding: utf-8 -*- class Node: ...