poj2823
这是一道题意简单,数据较大的题(喜闻乐见);
一开始可能会想到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后面的数全部退队;
由于单调队列是随着下标递增的,那么对于滚动窗口滚出的元素,从队头判断即可。
- var ans:array[..,..] of longint;
- a,w:array[..] of longint;
- h,f,r,mid,m,n,i,v:longint;
- begin
- readln(n,m);
- for i:= to n do
- read(a[i]);
- a[]:=-;
- for i:= to n do
- begin
- if a[i]>a[w[h]] then
- begin
- h:=h+;
- w[h]:=i;
- end
- else begin
- f:=;
- r:=h;
- repeat
- mid:=(f+r) div ;
- if (a[w[mid]]>=a[i]) and (a[w[mid-]]<a[i]) then break;
- if (a[w[mid]]>=a[i]) then r:=mid- else f:=mid+;
- until f>r;
- h:=mid;
- w[h]:=i;
- end;
- if i>=m then
- begin
- f:=;
- r:=h;
- v:=;
- repeat
- mid:=(f+r) div ;
- if w[mid]<i-m+ then f:=mid+;
- if w[mid]>=i-m+ then
- begin
- v:=mid;
- r:=mid-;
- end;
- until f>r;
- ans[i-m+,]:=a[w[v]];
- end;
- end;
- a[]:=;
- h:=;
- fillchar(w,sizeof(w),);
- for i:= to n do
- begin
- if a[i]<a[w[h]] then
- begin
- h:=h+;
- w[h]:=i;
- end
- else begin
- f:=;
- r:=h;
- repeat
- mid:=(f+r) div ;
- if (a[w[mid]]<=a[i]) and (a[w[mid-]]>a[i]) then break;
- if (a[w[mid]]<=a[i]) then r:=mid- else f:=mid+;
- until f>r;
- h:=mid;
- w[h]:=i;
- end;
- if i>=m then
- begin
- f:=;
- r:=h;
- v:=;
- repeat
- mid:=(f+r) div ;
- if w[mid]<i-m+ then f:=mid+;
- if w[mid]>=i-m+ then
- begin
- v:=mid;
- r:=mid-;
- end;
- until f>r;
- ans[i-m+,]:=a[w[v]];
- end;
- end;
- for i:= to n-m+ do
- write(ans[i,],' ');
- writeln;
- for i:= to n-m+ do
- write(ans[i,],' ');
- writeln;
- end.
单调队列,关键在于看出题目中的单调性;
还有单调队列一般存放标号比较方便
poj2823的更多相关文章
- 【poj2823】 Sliding Window
http://poj.org/problem?id=2823 (题目链接) 题意 维护滑动窗口最大最小值. Solution sb单调队列 代码 // poj2823 #include<algo ...
- POJ2823 Sliding Window (单调队列)
POJ2823 Sliding Window Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 38342 Accepte ...
- poj2823:单调队列入门题
今天学习了一下单调队列这种数据结构,思想不是很难 参考资料:http://www.cnblogs.com/Jason-Damon/archive/2012/04/19/2457889.html 然后自 ...
- poj2823 单调队列初步
什么是单调队列:头元素一直是队列当中的最大值,队列中的值按照递减顺序排列,可以从末尾插入一个元素,或从两段删除元素 1.插入元素,为了保证队列的单调性(这里假设为递减性),在插入元素v时要将对位的元素 ...
- 刷题向》POJ2823 单调队列裸题(<不会做,请自裁>系列)
最近BZOJ炸了,而我的博客上又更新了一些基本知识,所以这里刷一些裸题,用以丰富知识性博客 POJ2823 滑动的窗口 这是一道经典的单调队题,我记得我刚学的时候就是用这道题作为单调队列的例题,算 ...
- poj2823/hdu3415 - 数据结构 单调队列
poj2823 题目链接 长度为N的数组,求宽度k的滑动窗口在数组上滑动时窗口内的最大值或最小值 如果用单调队列做,求最小值时,队列应该严格递增的.所以插入时,队尾大于等于插入值的元素都应被舍弃,因为 ...
- POJ2823 单调队列
POJ2823 http://poj.org/problem?id=2823 最基础的单调队列,说是数据结构,其实就是一种更新数组数据的方法. 之前还准备用deque,超时了,直接head,tail快 ...
- POJ2823 Sliding Window
Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 53086 Accepted: 15227 Case Time Limi ...
- POJ2823 Sliding Window(单调队列)
题目要输出一个序列各个长度k的连续子序列的最大值最小值. 多次RMQ的算法也是能过的,不过单调队列O(n). 这题,队列存元素值以及元素下标,队尾出队维护单调性然后入队,队首出队保持新元素下标与队首元 ...
- 双端队列(单调队列)poj2823 区间最小值(RMQ也可以)
Sliding Window Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 41844 Accepted: 12384 ...
随机推荐
- mysql实例 保存查询结果到变量
本文介绍下,一个mysql的例子,将查询到的数据结果保存到一个变量中.有需要的朋友可以参考下. 本代码演示: 将mysql查询结果保存到变量中的方法. 代码: view source print? 0 ...
- Spark小课堂Week3 FirstSparkApp(RDD开发)
Spark小课堂Week3 FirstSparkApp 问题:Java有哪些数据结构 大致有如下几种,其中List与Map是最重要的: List Map Set Array Heap Stack Qu ...
- nodejs的模块系统(实例分析exprots和module.exprots)
前言:工欲善其事,必先利其器.模块系统是nodejs组织管理代码的利器也是调用第三方代码的途径,本文将详细讲解nodejs的模块系统.在文章最后实例分析一下exprots和module.exprots ...
- redis参考
www.redis.cn www.redis.io http://blog.nosqlfan.com/ 可以移步http://try.redis.io/进行实验命令 Redis 设计与实现(第一版) ...
- dive into python 读笔(3)
chapter 6 异常和文件处理: # 使用 try...except 来捕捉异常 # 使用 try...finally 来保护额外的资源 # 读取文件 # 在一个 for循环中一次赋多个值 # 使 ...
- ANN中Precision-Recall权衡
如果想要得到较高的精度,则需要较长的编码. 编码长度m增长的话,则item碰撞的概率会成倍的减小,从而导致召回率下降. 为了得到较高的召回率,则需要多个哈希表. 参考http://yongyuan.n ...
- 看几道JQuery试题后总结(下篇)
感谢圆友的提醒 昨天下午完成了9道试题中的前4道,之后好多园友存在些疑惑和建议,在这里我一并说一下吧.首先对于昨天第一题可能存在误导,在JQuery中并没有innerHTML这个属性,不过我们可以将J ...
- Android 环境搭建 版本问题
jdk1.6 1.7 eclipse 3.7.2 SDK-r12 ADT 12 SDK和ADT必须配套 搭建环境需要四个软件: 1.JDK(这是最新版本jdk1.7官方下载地址:http:// ...
- 【leetcode】Trapping Rain Water(hard)
Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...
- 学点PYTHON基础的东东--数据结构,算法,设计模式---单向链表
看来看来,还是以下这个实现最优雅.. 其它的,要么NODE冗余,要么初始化丑陋... #!/usr/bin/env python # -*- coding: utf-8 -*- class Node: ...