POJ-2823 单调队列的初学习

来源:互联网 发布:腹部脂肪如何减 知乎 编辑:程序博客网 时间:2024/05/19 18:15

点击打开链接

创建一个单调递增或是单调递减队列,队首储存的一定是最大或是最小的元素。

#include <iostream>#include <cstdio>#include <queue>#include <cmath>#include <algorithm>using namespace std;int a[1000005];int que[1000005];int n,m;void min_que(){int head,tail;head=1;tail=0;for(int i=1;i<=m;i++){while(head<=tail&&a[que[tail]]>=a[i]){tail--;}tail++;que[tail]=i;}for(int i=m;i<=n;i++){while(head<=tail&&a[que[tail]]>=a[i]){tail--;}tail++;que[tail]=i;while(que[head]<i-m+1){head++;}printf("%d",a[que[head]]);if(i==n){printf("\n");}else{printf(" ");}}}void max_que(){int head,tail;head=1;tail=0;for(int i=1;i<=m;i++){while(head<=tail&&a[que[tail]]<=a[i]){tail--;}tail++;que[tail]=i;}for(int i=m;i<=n;i++){while(head<=tail&&a[que[tail]]<=a[i]){tail--;}tail++;que[tail]=i;while(que[head]<i-m+1){head++;}printf("%d",a[que[head]]);if(i==n){printf("\n");}else{printf(" ");}}}int main(){while(~scanf("%d%d",&n,&m)){for(int i=1;i<=n;i++){scanf("%d",&a[i]);}min_que();max_que();}return 0;}


0 0
原创粉丝点击