POJ2823 Sliding Window (单调队列的基本应用)

来源:互联网 发布:mastercam编程教程 编辑:程序博客网 时间:2024/06/04 18:53

题目链接:

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


题意:

 给定一个长度为n的序列,求每个长度为k的区间的最大值与最小值


分析:

单调队列的基本应用


代码如下:

<span style="font-size:14px;">#include <iostream>#include <cstring>#include <cstdio>#include <queue>#include <vector>using namespace std;const int maxn = 1000010;int a[maxn];int main(){    int n,k;    while(~scanf("%d%d",&n,&k)){        for(int i=1;i<=n;i++)            scanf("%d",&a[i]);        deque<int > mmax;        deque<int > mmin;        for(int i=1;i<=n;i++){            while(!mmin.empty()&&a[i]<a[mmin.back()]) mmin.pop_back();            mmin.push_back(i);            if(i>=k){                while(!mmin.empty()&&mmin.front()<=i-k)                    mmin.pop_front();                if(i==n)                    printf("%d\n",a[mmin.front()]);                else                    printf("%d ",a[mmin.front()]);            }        }        for(int i=1;i<=n;i++){            while(!mmax.empty()&&a[i]>a[mmax.back()]) mmax.pop_back();            mmax.push_back(i);            if(i>=k){                while(!mmax.empty()&&mmax.front()<=i-k)                    mmax.pop_front();                if(i==n)                    printf("%d\n",a[mmax.front()]);                else                    printf("%d ",a[mmax.front()]);            }        }    }    return 0;}</span>


0 0