POJ 2823 Sliding Window - dp&单调队列优化

题目描述

想清楚两件事:
1.当前区间前面的元素没用
2.当前区间有了较小的元素,则以前较大的元素没用,因为当前用不到,以后更用不到。

#include<cstdio>
#define MAXN 1000000

struct node{
    int val,pos;
}que[MAXN+10];

int n,k,a[MAXN+10],mn[MAXN+10],mx[MAXN+10];

void read()
{
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
}
void DP()
{
    int front=0,rear=0;
    for(int i=1;i<=k;i++){
        while(front<rear){
            if(que[rear-1].val>=a[i])
                rear--;
            else
                break;
        }
        que[rear].pos=i,que[rear].val=a[i];
        rear++;
    }
    for(int i=k+1;i<=n+1;i++){
        while(front<rear){
            if(que[front].pos<i-k)
                front++;
            else
                break;
        }
        mn[i-k]=que[front].val;
        while(front<rear){
            if(que[rear-1].val>=a[i])
                rear--;
            else
                break;
        }
        que[rear].pos=i,que[rear].val=a[i];
        rear++;
    }
    front=rear=0;
    for(int i=1;i<=k;i++){
        while(front<rear){
            if(que[rear-1].val<=a[i])
                rear--;
            else
                break;
        }
        que[rear].pos=i,que[rear].val=a[i];
        rear++;
    }
    for(int i=k+1;i<=n+1;i++){
        while(front<rear){
            if(que[front].pos<i-k)
                front++;
            else
                break;
        }
        mx[i-k]=que[front].val;
        while(front<rear){
            if(que[rear-1].val<=a[i])
                rear--;
            else
                break;
        }
        que[rear].pos=i,que[rear].val=a[i];
        rear++;
    }
}
int main()
{
    read();
    DP();
    for(int i=1;i<=n-k+1;i++)
        printf("%d ",mn[i]);
    printf("\n");
    for(int i=1;i<=n-k+1;i++)
        printf("%d ",mx[i]);
}
posted @ 2016-02-03 22:02  KatarinaYuan  阅读(95)  评论(0编辑  收藏  举报