POJ:2823 Sliding Window(单调队列)

单调队列。

分别用两个双端队列维护最小值和最大值。

C++能过,G++超时。

一开始用STL,C++也超时了,自己手写了一个过掉了。。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <cmath>
#include <queue>
#include <algorithm>
#define ll long long
#define INF 2139062143
#define inf -2139062144
#define MOD 20071027
#define MAXN 1000005
using namespace std;
int que[MAXN],front,rear;
int arr[MAXN];
int main()
{
    int n,k;
    scanf("%d%d",&n,&k);
    for(int i=1; i<=n; ++i)
        scanf("%d",&arr[i]);
    front=1;
    rear=0;
    for(int i=1; i<=n; ++i)
    {
        while(front<=rear&&que[front]<(i+1-k)) front++;
        while(front<=rear&&arr[i]<arr[que[rear]]) rear--;
        que[++rear]=i;
        if(i>=k)
        {
            if(i!=k) printf(" ");
            printf("%d",arr[que[front]]);
        }
    }
    printf("\n");
    front=1;
    rear=0;
    for(int i=1; i<=n; ++i)
    {
        while(front<=rear&&que[front]<(i+1-k)) front++;
        while(front<=rear&&arr[i]>arr[que[rear]]) rear--;
        que[++rear]=i;
        if(i>=k)
        {
            if(i!=k) printf(" ");
            printf("%d",arr[que[front]]);
        }
    }
    printf("\n");
    return 0;
}


 

你可能感兴趣的:(POJ:2823 Sliding Window(单调队列))