【问题描述】

给你一个长度为N的数组,一个长为K的滑动的窗体从最左移至最右端,你只能见到窗口的K个数,每次窗体向右移动一位,如下表:

【样例输入】

8 3

1 3 -1 -3 5 3 6 7

【样例输出】

-1 -3 -3 -3 3 3

3 3 5 5 6 7

【解题思路】

首先,不难想到用枚举的办法,对于每一个区间,枚举其中的最大值和最小值,但对于n<=1000000的数据来说,枚举必定超时,因此我们可以用到队列来进行优化。

我们取前k个数中的最大值和最小值,放入两个队列中,设放最大值的为k,放最小值的为q,对于之后的每一个数如果比k中的队尾元素大,那么k的队尾元素便可删去(因为可以证明,在之后的任何一个区间内都用不上该元素),若比队尾元素小,便入队。q队列则是反操作。于是,对于每一个区间的最小值和最大值,我们只需要记录q和k队列中的队首元素即可。由于输出的要求我在这用了两个过程,先求最小值,然后求最大值。详见代码。

【代码实现】

var q,a:array[..] of longint;
n,k,i,j:longint;
procedure work;
var i,f,r:longint;
begin
f:=;
r:=;
q[f]:=;
for i:= to k do
begin
while (f<=r)and(a[q[r]]>=a[i]) do
dec(r);
inc(r);
q[r]:=i;
end;//初始化q队列
write(a[q[f]],' ');
for i:= to n-k+ do
begin
if q[f]<i then
inc(f);
while (f<=r)and(a[q[r]]>=a[i+k-]) do//若当前元素比队尾元素小,删除队尾元素
dec(r);
inc(r);
q[r]:=i+k-;
write(a[q[f]],' ');
end;
end;
procedure work1;
var i,f,r:longint;
begin
f:=;
r:=;
q[f]:=;
for i:= to k do
begin
while(f<=r)and(a[q[r]]<=a[i]) do
dec(r);
inc(r);
q[r]:=i;
end;
write(a[q[f]],' ');//初始化k队列
for i:= to n-k+ do
begin
if q[f]<i then
inc(f);
while (f<=r)and(a[q[r]]<=a[i+k-]) do//若当前数比队尾元素大,删除队尾元素
dec(r);
inc(r);
q[r]:=i+k-;
write(a[q[f]],' ');
end;
end;
begin
readln(n,k);
for i:= to n do
read(a[i]);
work;
fillchar(q,sizeof(q),);
writeln;
work1;
writeln;
end.

sliding windows (poj 2823) 题解的更多相关文章

  1. Sliding Window POJ - 2823 单调队列模板题

    Sliding Window POJ - 2823 单调队列模板题 题意 给出一个数列 并且给出一个数m 问每个连续的m中的最小\最大值是多少,并输出 思路 使用单调队列来写,拿最小值来举例 要求区间 ...

  2. AC日记——Sliding Window poj 2823

    2823 思路: 单调队列: 以前遇到都是用线段树水过: 现在为了优化dp不得不学习单调队列了: 代码: #include <cstdio> #include <cstring> ...

  3. Sliding Window POJ - 2823

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

  4. 单调栈(G - Sliding Window POJ - 2823 )

    题目链接:https://cn.vjudge.net/contest/276251#problem/G 题目大意:给你n和m,然后问你对于(m,n)这中间的每一个数,(i-m+1,i)这个区间的最小值 ...

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

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

  6. POJ 2823 Sliding Window 题解

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

  7. POJ 2823 Sliding Window + 单调队列

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

  8. 【POJ 2823】Sliding Window(单调队列/堆)

    BUPT2017 wintertraining(16) #5 D POJ - 2823 题意 给定n,k,求滑窗[i,i+k-1]在(1<=i<=n)的最大值最小值. 题解 单调队列或堆. ...

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

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

随机推荐

  1. win10 TortoiseSVN 部分图标不显示

    原因:https://msdn.microsoft.com/en-us/library/cc144123(VS.85).aspx Note   The number of different icon ...

  2. Linux下查看文件和文件夹大小(转)

    觉得挺有用的,就转到了自己的博客里,方便以后查询: 转自:http://www.cnblogs.com/benio/archive/2010/10/13/1849946.html 当磁盘大小超过标准时 ...

  3. GUI创建各常用控件(二)

    继续接着上一篇! 在我看来有一点需要申明:由于是GUI的相关知识,所以我只是在复习中粗略的总结而已,因此参考价值可能有限,更多的是当作自己学习的一个记录以及便于自己查阅. 好啦!干货继续: 1.类似于 ...

  4. 传智Java基础知识测试

    共40道选择题,每题2.5分.多选题有错则全错,全对才满分. 单选题: 1.   下列哪个声明是错误的?(B) A.  int  i=10; B.  float  f=1.1; C.  double  ...

  5. Oracle数据库(1)

    Oracle基本数据类型:Oracle的基本呢数据类型按类型分为:字符串类型,数据类型,日期类型,LOB类型等.1.字符串类型:①char:定长字符串,最多存储2k字节,在不指定char长度的情况下, ...

  6. nginx 配置高并发

    一.一般来说nginx 配置文件中对优化比较有作用的为以下几项: 1.  worker_processes 8; nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (如,2个四核的cpu ...

  7. Object-oriented features

    Python is an object-oriented programing language, which means that it provides features that support ...

  8. iOS打电话、发短信

    方式一:使用该方法进行拨号之后,当电话挂断之后不会反回应用程序,会停留在电话记录界面,不会反回应用程序      NSURL *url = [NSURL URLWithString:@"te ...

  9. NOIP2007 守望者的逃离-DP

    https://vijos.org/p/1431 描述 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变.守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上.为了杀死守 ...

  10. 学习总结 JAVA环境配置 及其相应的步骤

    相应的操作步骤 第一步: 右键我的电脑→属性→高级系统设置→环境变量→打开环境变量 第二步:在系统变量中添加JAVA_HOME ,并引用到相对应的地址. 第三步:在系统变量 path 中最前端(按ho ...