2020-02-13 单调队列

模板:递增队列或是递减队列只需要修改删除队尾元素的判断条件即可。
原理 以递增队列举例:
以一个长度为k的移动窗口从k处开始移动,遍历数组中的每个元素,添加到队列末尾并且于前一个元素相比较,直到有一个元素大于当前元素,退出循环,将当前元素加入队列,并且将位置坐标另记入一个位置数组。寻找k长度窗口内的最大值则只需要在位置数组遍历,第一个大于等于i的就是所求的最大值。
···

include<iostream>

include<cstdio>

include<cstring>

include<string>

include<queue>

include<map>

include<vector>

include<algorithm>

include<stack>

include<set>

using namespace std;
typedef long long ll;
const int N=1000010;
const int inf=0x3f3f3f;
int n,k;
int q[N],mk[N],a[N];
void qmax()
{
int i,st=1,tt=1;
for(i=1;i<=n;i++)
{
while(tt<st&&q[st-1]<=a[i]) st--;
q[st]=a[i];mk[st]=i;st++;
if(i>=k)
{
while(tt<st&&mk[tt]<=i-k) tt++;
printf("%d ",q[tt]);
}
}
}
void qmin()
{
int i,st=1,tt=1;
for(i=1;i<=n;i++)
{
while(tt<st&&q[st-1]>=a[i]) st--;
q[st]=a[i];mk[st]=i;st++;
if(i>=k)
{
while(tt<st&&mk[tt]<=i-k) tt++;
printf("%d ",q[tt]);
}
}
}
int main() {
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
qmin();
printf("\n");
qmax();
printf("\n");
return 0;
}···

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,427评论 0 2
  • 题目来源:1、中兴、华为、慧通、英华达、微软亚洲技术中心等中外企业面试题目;2、C 语言面试宝典(林锐《高质量编程...
    月震阅读 1,868评论 0 1
  • C语言的学习要从基础开始,这里是100个经典的算法-1C语言的学习要从基础开始,这里是100个经典的 算法 题目:...
    Poison_19ce阅读 1,200评论 0 0
  • 计算机二级C语言上机题库(南开版) 1.m个人的成绩存放在score数组中,请编写函数fun,它的功能是:将低于平...
    MrSunbeam阅读 6,502评论 1 42
  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 2,060评论 0 2