码迷,mamicode.com
首页 > Windows程序 > 详细

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

时间:2014-12-16 17:05:43      阅读:229      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   ar   io   os   sp   for   on   

题目链接:

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>


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

标签:style   blog   http   ar   io   os   sp   for   on   

原文地址:http://blog.csdn.net/bigbigship/article/details/41962265

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!