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 ...
随机推荐
- Java学习笔记:语言基础
Java学习笔记:语言基础 2014-1-31 最近开始学习Java,目的倒不在于想深入的掌握Java开发,而是想了解Java的基本语法,可以阅读Java源代码,从而拓展一些知识面.同时为学习An ...
- 使用FileResult导出txtl数据文件
public FileResult ExportMobileNoTxt(SearchClientModel model){ var sbTxt = new StringBuilder(); ; i & ...
- 1048. Find Coins (25)
时间限制 50 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Eva loves to collect coins from a ...
- Java实现mysql数据库备份
Runtime是一个与JVM运行时环境有关的类,这个类是Singleton的. Runtime.getRuntime()可以取得当前JVM的运行时环境,这也是在Java中唯一一个得到运行时环境的方法. ...
- Mysql 配置主从服务自动同步功能
1.修改主服务器master: #vi /etc/my.cnf [mysqld] log-bin=mysql-bin //[必须]启用二进制日志 serve ...
- 在虚拟中开启Windows 8.1的Hyper-V平台
VM安装windows8开启Hype-V 今天老魏用VM安装了Windows8.1系统,想用此系统来开发一下Windows Phone8,但是要求确实要开启Hyper-V平台技术,本来是没有任何的问题 ...
- 硬盘4k对齐教程总结
4k对齐概念: 4K对齐相关联的是一个叫做“高级格式化”的分区技术.首先先来了解一下什么是叫做“4K 对齐”.其实“4K对齐”相关联的是一个叫做“高级格式化”的分区技术.“高级格式化”是国际硬盘设备与 ...
- 在Hadoop分布式文件系统的索引和搜索
FROM:http://www.drdobbs.com/parallel/indexing-and-searching-on-a-hadoop-distr/226300241?pgno=3 在今天的信 ...
- linux下nginx的安装
一.安装nginx 1.在nginx官方网站下载一个包,下载地址是:http://nginx.org/en/download.html 2.WinSCP(ftp上传工具).exe FT ...
- BeanFactory和FactoryBean
BeanFactory和FactoryBean 1.BeanFactory BeanFactory定义了 IOC 容器的最基本形式,并提供了 IOC 容器应遵守的的最基本的接口,也就是Spring I ...