【单调队列】poj 2823 Sliding Windows

来源:互联网 发布:ccn是什么网络 编辑:程序博客网 时间:2024/05/01 22:01

http://poj.org/problem?id=2823

#include <iostream>#include <cstdio>using namespace std;const int NM=1000005;int a[NM],que[NM];int n,len;void Min_win(){int tail,head,i;head=1;tail=0;for(i=1;i<=len;i++){while(tail>=head&&a[que[tail]]>a[i])tail--;tail++;que[tail]=i;}for(i=len;i<=n;i++){while(tail>=head&&a[que[tail]]>a[i])tail--;tail++;que[tail]=i;while(que[head]<i-len+1)head++;printf("%d",a[que[head]]);if(i<=n) printf(" ");}}void Max_win(){int tail,head,i;tail=0;head=1;for(i=1;i<=len;i++){while(head<=tail&&a[que[tail]]<a[i])tail--;tail++;que[tail]=i;}for(i=len;i<=n;i++){while(head<=tail&&a[que[tail]]<a[i])tail--;tail++;que[tail]=i;while(que[head]<i-len+1)head++;printf("%d",a[que[head]]);if(i<=n) printf(" ");}}int main(){int i;while(scanf("%d%d",&n,&len)!=EOF){for(i=1;i<=n;i++)scanf("%d",&a[i]);Min_win();printf("\n");Max_win();printf("\n");}return 0;}