單調隊列

模板題

題目鏈接: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;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章