poj2823-单调队列

来源:互联网 发布:中国汽车发展历史 知乎 编辑:程序博客网 时间:2024/05/17 08:11
#include<stdio.h>#include<string.h>#include<algorithm>#include<queue>#define M 1000005using namespace std;int head,rear,n,a[M],q[M],k,mi[M],ma[M];void in_queue(int i){    while(head<=rear&&a[i]<=a[ q[rear] ])//入队,删除队尾元素中比它大的        rear--;    q[++rear]=i;}void out_queue(int i){    if(q[head] < i-k+1) //删除队首元素        head++;}void in_queue1(int i){    while(head<=rear && a[i]>=a[ q[rear] ])//删除队尾元素比它小的    rear--;    q[++rear]=i;}int main(){    int l;    while(scanf("%d%d",&n,&k)!=EOF)    {        if(k>=n)        {            k=n;        }        l=0,head=0,rear=-1;        for(int i=1; i<=n; i++)        {            scanf("%d",&a[i]);            in_queue(i);            out_queue(i);            if(i>=k)            {                mi[l++]=a[ q[head] ];            }        }        l=0,head=0,rear=-1;        for(int i=1; i<=n ; i++)        {            in_queue1(i);            out_queue(i);            if(i>=k)                ma[l++]=a[ q[head] ];        }        for(int i=0; i<n-k+1 ; i++)            printf("%d ",mi[i]);        printf("\n");        for(int i=0; i<n-k+1 ; i++)            printf("%d ",ma[i]);        printf("\n");    }    return 0;}


0 0