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