POJ 2823 Sliding Window (模板题)【单调队列】
<题目链接>
<转载于>>> >
题目大意:
给你一段序列和一个长为k的窗口,这个窗口从最左边逐渐向右滑,直到滑到最右边,问你,该窗口在滑动的过程中,最大值和最小值是多少。
解题分析:
解决这个问题可以使用一种叫做单调队列的数据结构,它维护这样一种队列:
a)从队头到队尾,元素在我们所关注的指标下是递减的(严格递减,而不是非递增),比如查询如果每次问的是窗口内的最小值,那么队列中元素从左至右就应该递增,如果每次问的是窗口内的最大值,则应该递减,依此类推。这是为了保证每次查询只需要取队头元素。
b)从队头到队尾,元素对应的时刻(此题中是该元素在数列a中的下标)是递增的,但不要求连续,这是为了保证最左面的元素总是最先过期,且每当有新元素来临的时候一定是插入队尾。
满足以上两点的队列就是单调队列,首先,只有第一个元素的序列一定是单调队列。
那么怎么维护这个单调队列呢?无非是处理插入和查询两个操作。
对于插入,由于性质b,因此来的新元素插入到队列的最后就能维持b)继续成立。但是为了维护a)的成立,即元素在我们关注的指标下递减,从队尾插入新元素的时候可能要删除队尾的一些元素,具体说来就是,找到第一个大于(在所关注指标下)新元素的元素,删除其后所有元素,并将新元素插于其后。因为所有被删除的元素都比新元素要小,而且比新元素要旧,因此在以后的任何查询中都不可能成为答案,所以可以放心删除。
对于查询,由于性质b,因此所有该时刻过期的元素一定都集中在队头,因此利用查询的时机删除队头所有过期的元素,在不含过期元素后,队头得元素就是查询的答案(性质a),将其返回即可。
由于每个元素都进队出队一次,因此摊销复杂度为O(n)。
单调队列模板题,维护两个单调队列,一个维护最小值,单调递增,最小值在队首,另一个维护最大值,单调递减,最大值在队首,然后在窗口滑动的过程中,记录下队首即可 。
#include <cstdio> #include <cstring> ; int n,k; int a[M],qmax[M],qmin[M],pmax[M],pmin[M],mx[M],mi[M]; void get_max(){ ,head=; ;i<k;i++){ while(head<=tail&&qmax[tail]<=a[i]) --tail; qmax[++tail]=a[i]; pmax[tail]=i; } for(int i=k;i<=n;i++){ while(head<=tail&&qmax[tail]<=a[i]) --tail; qmax[++tail]=a[i]; pmax[tail]=i; ) ++head; mx[i-k+]=qmax[head]; } ;i<=n-k+;i++){ i==?printf("%d",mx[i]):printf(" %d",mx[i]); } printf("\n"); } void get_min(){ ,head=; ;i<k;i++){ //先开始将前k-1个元素插入优先队列 while(head<=tail&&qmin[tail]>=a[i]) //求最小值,维护一个单调递增的队列,最小值在队首 --tail; qmin[++tail]=a[i]; //将队尾不符合条件的元素删除后,将该元素插入队尾 pmin[tail]=i; //队尾元素的位置 } for(int i=k;i<=n;i++){ //然后将从第k个元素及以后插入优先队列,此时就要注意过期的队首元素的删除 while(head<=tail&&qmin[tail]>=a[i]) //依然是插入时的维护 --tail; qmin[++tail]=a[i]; pmin[tail]=i; ) //如果队首元素的下标过小,则将该过期的队首元素删除 ++head; mi[i-k+]=qmin[head]; //记录下新队首元素的下标 } ;i<=n-k+;i++){ i==?printf("%d",mi[i]):printf(" %d",mi[i]); } printf("\n"); } int main(){ while(scanf("%d %d",&n,&k)!=EOF){ ;i<=n;i++){ scanf("%d",&a[i]); } get_min(); get_max(); } ; }
2018-09-23
最新文章
- C# 本质论 第一章 C#概述
- Android 百度云媒体 等播放器播放4:3等多种比例的视频 大小配置的问题
- 2016CCPC东北地区大学生程序设计竞赛 1005 HDU5926
- 【SQL】SQL中笛卡尔积、内连接、外连接的数据演示
- HDU 2829 Lawrence (斜率DP)
- Part 57 to 58 Why should you override ToString and Equal Method
- JS数据类型&;&;typeof&;&;其他
- 用js捕捉鼠标连续点击三次事件怎么实现啊
- js object 常用方法总结
- hexdump
- pythonのpygame安装
- Spring boot 配置 mybatis xml和动态SQL 分页配置
- win10系统安装两个版本的python,该怎么安装Django
- AGC027 C - ABland Yard 拓扑排序
- Docker - Docker中搭建MySQL主从
- LeetCode – First Missing Positive
- Bootstrap(5)栅格系统
- python---Django中模型类中Meta元对象了解
- e676. 把彩色图像转换为灰色
- ashx、aspx、ASP.NET MVC