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 ...
随机推荐
- slider jq小插件
html代码 <div class="r_list r_1" style="display:block;"> <div class=" ...
- 让Ecshop网店系统用户自动登陆
让Ecshop网店系统用户户自动登陆,打开ecshop includes/init.php文件,可以发现Ecshop系统判断用户的SESSION不存在的时候会去读取存储在COOKIES里面的值.如下代 ...
- C++ 容器及选用总结
目录 ==================================================== 第一章 容器 第二章 Vector和string 第三章 关联容器 第四章 迭代器 第五 ...
- 因程序问题引起的服务器CPU负荷一直保持在90%以上
昨天早上刚到办公室,就接到客户的电话说其某台小型机的CPU负荷一直保持在90以上,告警短信发个不停,一直没有间断过.该服务器是一台IBM的小型机,性能应该还是不错的,出现这样的情况确实不太正常.登陆上 ...
- 【IOCP】 IOCP模型属于一种通讯模型- 较难
http://baike.baidu.com/link?url=e9vXkKd2aHp8VDr1XTURdwQB4K85r28IYjeMwRIyuaXtsrCsXHY1eohiFgsDXRYRlj6x ...
- Linux Mint SmoothTask2的安装方法
首先,先下载smooth task:点击这里下载 下载之后解压缩,里面有个install文件,点击打开: To install plasmoid unpack archive, go to the d ...
- java第六课 oop
java oop 1.面向过程的结构化程序设计弊端:方法和数据结构都是毫无规律的定义在程序中任何位置 方法定义和方法要处理的数据结构也都是分开定义 2.对象:每new一次,就创建1个新对 ...
- HTTP幂等性
http://www.cnblogs.com/weidagang2046/archive/2011/06/04/2063696.html 理解HTTP幂等性 基于HTTP协议的Web API是时下最为 ...
- 3111: [Zjoi2013]蚂蚁寻路 - BZOJ
题目描述 Description在一个 n*m 的棋盘上,每个格子有一个权值,初始时,在某个格子的顶点处一只面朝北的蚂蚁,我们只知道它的行走路线是如何转弯,却不知道每次转弯前走了多长.蚂蚁转弯是有一定 ...
- 1071: [SCOI2007]组队 - BZOJ
Description NBA每年都有球员选秀环节.通常用速度和身高两项数据来衡量一个篮球运动员的基本素质.假如一支球队里速度最慢的球员速度为minV,身高最矮的球员高度为minH,那么这支球队的所有 ...