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

来源:互联网 发布:网络直销流程五步 编辑:程序博客网 时间:2024/06/05 00:19

题目描述

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

#include<cstdio>#define MAXN 1000000struct 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]);}
0 0
原创粉丝点击