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 ...
随机推荐
- Python垃圾回收机制详解
一.垃圾回收机制 Python中的垃圾回收是以引用计数为主,分代收集为辅.引用计数的缺陷是循环引用的问题. 在Python中,如果一个对象的引用数为0,Python虚拟机就会回收这个对象的内存. #e ...
- Hello World for U (20)
Given any string of N (>=5) characters, you are asked to form the characters into the shape of U. ...
- Object c中的alloc和init问题
从开始学的NSString *name=[[NSString alloc] init] 起,老师教这句话是分配内存空间,一直在用,从来没考虑过它的内部是怎么实现的.今天无意中看到了这一句代码 NSSt ...
- 制作复选框(Toggle)
怎样判断是否应当使用复选框 复选框,就是对一个选项做上一个标记,表示这个选项已经被选中了.在游戏中,复选框一般用来做一些选项的控制,这种选项一般都只有两种答案:是和否.例如,单击一下开启音乐的复选框, ...
- mybatis generator自动生成 实体类, sqlmap配置文件 详细介绍
我使用的是Eclipse Luna 装了自己常用的插件, generator也是其中一个推荐下载 MyBatis_Generator_1.3.1.zip离线安装包 <?xml version=& ...
- sql之解决数据库表的循环依赖问题
三张数据表关系如图: 其实出现表循环依赖情况:就是 同时 ConfigCompany和 Department 也有依赖,就会报错,说有循环依赖,就会报错. 所以 这个时候的解决办法:可以改 在数据库 ...
- 滤镜简单demo(转,供参考)
NSURL *iamgeUrl = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"default" ...
- main函数(本文较老,仅作参考)
Xcode4.2之前的main函数如下: int main(int argc, char *argv[]) { NSAutoreleasePool *pool = [[NSAutoreleasePoo ...
- 通过分析WP的代码来学习PHP。1
下载了WP的代码,并且应用到了网站上面,现在也在正常的运行中,地址是:www.freealgorithm.tk .具体的申请过程就不赘述了,学习WP的代码. 他的目录结构就不看了,可以下载同名文件我会 ...
- 自定义Angular指令与jQuery实现的Bootstrap风格数据双向绑定的单选&多选下拉框
先说点闲话,熟悉Angular的猿们会喜欢这个插件的. 00.本末倒置 不得不承认我是一个喜欢本末倒置的人,学生时代就喜欢先把晚交的作业先做,留着马上就要交的作业不做,然后慢悠悠做完不重要的作业,卧槽 ...