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]);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章