sliding windows (poj 2823) 题解
【问题描述】
给你一个长度为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) 题解的更多相关文章
- Sliding Window POJ - 2823 单调队列模板题
Sliding Window POJ - 2823 单调队列模板题 题意 给出一个数列 并且给出一个数m 问每个连续的m中的最小\最大值是多少,并输出 思路 使用单调队列来写,拿最小值来举例 要求区间 ...
- AC日记——Sliding Window poj 2823
2823 思路: 单调队列: 以前遇到都是用线段树水过: 现在为了优化dp不得不学习单调队列了: 代码: #include <cstdio> #include <cstring> ...
- 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 ...
- 单调栈(G - Sliding Window POJ - 2823 )
题目链接:https://cn.vjudge.net/contest/276251#problem/G 题目大意:给你n和m,然后问你对于(m,n)这中间的每一个数,(i-m+1,i)这个区间的最小值 ...
- poj 2823 Sliding Window (单调队列入门)
/***************************************************************** 题目: Sliding Window(poj 2823) 链接: ...
- POJ 2823 Sliding Window 题解
POJ 2823 Sliding Window 题解 Description An array of size n ≤ 106 is given to you. There is a sliding ...
- POJ 2823 Sliding Window + 单调队列
一.概念介绍 1. 双端队列 双端队列是一种线性表,是一种特殊的队列,遵守先进先出的原则.双端队列支持以下4种操作: (1) 从队首删除 (2) 从队尾删除 (3) 从队尾插入 (4) ...
- 【POJ 2823】Sliding Window(单调队列/堆)
BUPT2017 wintertraining(16) #5 D POJ - 2823 题意 给定n,k,求滑窗[i,i+k-1]在(1<=i<=n)的最大值最小值. 题解 单调队列或堆. ...
- 洛谷P1886 滑动窗口(POJ.2823 Sliding Window)(区间最值)
To 洛谷.1886 滑动窗口 To POJ.2823 Sliding Window 题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每 ...
随机推荐
- Spring Data Jpa真爽啊
http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-jpa/ 持久层的实现类可以让框架生成.只需要声明持久层接口,框架直接生成代理 ...
- struts2+hibernate+poi导出Excel实例
本实例通过struts2+hibernate+poi实现导出数据导入到Excel的功能 用到的jar包: poi 下载地址:http://poi.apache.org/ 根据查询条件的选择显示相应数据 ...
- Hive基础之HiveServer2 JDBC的使用
启动HiveServer2: cd $HIVE_HOME/bin 以后台方式默认端口启动HiveServer2(默认端口是10000):hiveserver2 & 以后台方式指定端口的方式启动 ...
- (Loadrunner)Error: Failed to send data by channels - post message failed.(转)
把Diagnotics-configure-Web Page Diagnotics 设置为 转自: http://www.51testing.com/html/64/371664-3708254.ht ...
- pytest学习笔记(三)
接着上一篇的内容,这里主要讲下参数化,pytest很好的支持了测试函数中变量的参数化 一.pytest的参数化 1.通过命令行来实现参数化 文档中给了一个简单的例子, test_compute.py ...
- 视差贴图(Parallax Mapping)
使用顶点光照的模型,当模型的面数很少的时候,光照效果会显得很奇怪,因为只有顶点上的光照是正确计算出来的,三角面上的光照都是通过硬件插值得到,所以难免会出现问题.基于像素的光照可以很好的改善这个问题.如 ...
- 【翻译习作】 Windows Workflow Foundation程序开发-第一章02
1.2 Windows Workflow概览 微软的Windows Workflow Foundation(简称WF)是.NET框架3.0版的一部分..NET3.0其它主要部分是Window ...
- 免费的API接口
有如下三个Json格式的查询天气预报接口: http://www.weather.com.cn/data/sk/101010100.html http://www.weather.com.cn/dat ...
- js实现自动登陆的按钮
自动按钮,只要实现当移入是提示用户不要在公共地方使用自动登陆 主要用onmouseover函数,本来提示div隐藏,当移入时div显示. <style type="text/css&q ...
- chrome 浏览器命令
地址栏中输入如下命令可以得到相应的信息: 命令 作用 备注 chrome://dns/ 查看 Chromium 的DNS预取的域名 chrome://net-internals Capture E ...