poj 2823 单调队列 入门 代码附注释
2014-02-10 23:59
323 查看
关于单调队列的介绍请移步:http://xuyemin520.is-programmer.com/posts/25964
结合poj2823理解比较好:http://poj.org/problem?id=2823
代码如下(跑得比较慢):
结合poj2823理解比较好:http://poj.org/problem?id=2823
代码如下(跑得比较慢):
#include <cstdio> const int Maxn=1000000+100; int n,k; int id[Maxn],minn[Maxn],maxn[Maxn],date[Maxn]; void Min() { int first=1,last=1; id[last++]=1;//第一个先初始化 minn[1]=date[1]; for(int i=2;i<=n;i++) { while(date[id[last-1]]>date[i]&&first<last)//尾删除。通过索引(id[last-1])间接找到当前索引的值date[] last--; id[last++]=i;//必须在尾删除后更新尾索引值。 while(id[first]<i-k+1)//对首删除。超出i-k+1就删除。//下同。 first++; minn[i]=date[id[first]]; } } void Max() { int first=1,last=1; id[last++]=1; maxn[1]=date[1]; for(int i=2;i<=n;i++) { while(date[id[last-1]]<date[i]&&first<last) last--; id[last++]=i; while(id[first]<i-k+1) first++; maxn[i]=date[id[first]]; } } int main() { scanf("%d %d",&n,&k); for(int i=1;i<=n;i++) scanf("%d",&date[i]); Min(); Max(); for(int i=k;i<=n;i++) printf("%d ",minn[i]); printf("\n"); for(int i=k;i<=n;i++) printf("%d ",maxn[i]); return 0; }
相关文章推荐
- POJ2823——Sliding Window 单调队列入门
- 单调队列入门——POJ - 2823,HDU - 3530,HDU - 2430
- POJ 2823 Sliding Window(单调队列入门水题)
- poj~2823(单调队列入门)
- POJ 2823 (从经典滑动窗口最大值问题入门单调队列)
- POJ 2823 单调队列入门水题
- POJ 2823 UESTCoj 1221 Sliding Window 单调队列 经典入门题
- poj 2823 Sliding Window (单调队列入门)
- POJ 2823 单调队列入门题
- POJ 2823 UESTCoj 1221 Sliding Window 单调队列 经典入门题
- poj 2823 单调队列入门题(内含手写队列的学习和模板)
- 单调队列 | 线段树 | 一维RMQ —— POJ 2823
- poj 2823 Sliding Window(单调队列)
- POJ 2823:Sliding Window 单调队列
- Sliding Window POJ - 2823 单调队列
- poj 2823单调队列模板题
- poj 2823 Sliding Window 单调队列
- poj_2823(单调队列)
- [NOIP模拟][POJ 2823][单调队列]滑动的窗户(Sliding Window)
- poj 2823 滑动窗口 单调队列/线段树