单调队列

来源:互联网 发布:备案是域名还是空间 编辑:程序博客网 时间:2024/06/05 14:28

模板题

题目链接:http://poj.org/problem?id=2823

单调队列的模板,用到了双端队列。需要输出一个最大,一个最小,起初先用了两个队列分别求解最大最小,存在两个数组里面,但发现时间超时,必须优化,所以就改成用一个队列,但这里我用的pair 构造了一个容器,之后直接输出就可以,但是空格和回车我之前用printf输出,会超时,改成putchar 之后勉强通过,如果改成用数组存起来,最后输出,可以缩短时间。下面是代码:


#include<cstdio>#include<iostream>#include<deque>using namespace std;int window[1000005];int maxn[1000005];int mint[1000005];int n,k,t;int main(){    scanf("%d%d", &n, &k);    for(int i = 1; i<= n; i++)    {        scanf("%d", &window[i]);    }    deque<pair<int, int> >q;    for(int i = 1; i<= n; i++)    {        int val = window[i];        while(!q.empty() && q.back().first >= val){            q.pop_back();        }        q.push_back(make_pair(val,i));        if(i >= k)        {            while(!q.empty() && q.front().second < i - k + 1){                q.pop_front();            }            ///printf("%d", q.front().first);            ///if(i!=n)            ///putchar(' ');            mint[t++] = q.front().first;        }    }    ///putchar('\n');    q.clear();    t=0;    for(int i = 1; i<= n; i++)    {        int val = window[i];        while(!q.empty() && q.back().first <= val){            q.pop_back();        }        q.push_back(make_pair(val,i));        if(i >= k)        {            while(!q.empty() && q.front().second < i - k + 1){                q.pop_front();            }            ///printf("%d", q.front().first);///是第一种方法            ///if(i!=n)                ///putchar(' ');            maxn[t++] = q.front().first;///第二种方法        }    }    ///putchar('\n');    for(int i = 0; i< t; i++){        printf("%d",mint[i]);        if(i!=t-1)            printf(" ");    }    printf("\n");    for(int i = 0; i< t; i++){        printf("%d",maxn[i]);        if(i!=t-1)            printf(" ");    }    return 0;}


0 0
原创粉丝点击