POj 2823

来源:互联网 发布:sacdiso mac播放 编辑:程序博客网 时间:2024/06/08 06:04
比较好用的就是单调队列了,时间复杂度为O(N),这样做出来的时间是5500ms左右,算是POj上该题的平均时间。


代码如下:

// POJ 2823//2012-8-6//wxping#define Max 1000000#include <stdio.h>#include <fstream>typedef struct{     int date,pos;}Queue;Queue qumax[Max],qumin[Max];int maxx[Max],minn[Max],a[Max],n,k;void solve(){    int i1=0,i2=0,j=0,a,front1=0,rear1=0,pushc1=0,posc1=0,front2=0,rear2=0,pushc2=0,posc2=0;    for(j=0;j<k;j++)   {       scanf("%d",&a);        while(front1<rear1 && qumax[rear1-1].date<a)       rear1--;       qumax[rear1].date=a;       qumax[rear1].pos=pushc1;       rear1++;pushc1++;       while(front2<rear2 && qumin[rear2-1].date>a)       rear2--;       qumin[rear2].date=a;       qumin[rear2].pos=pushc2;       rear2++;pushc2++;    }    maxx[i1++]=qumax[front1].date;    minn[i2++]=qumin[front2].date;    for(j;j<n;j++)   {       scanf("%d",&a);       if(qumax[front1].pos==posc1) front1++;       posc1++;       while(front1<rear1 && qumax[rear1-1].date<a)       rear1--;      qumax[rear1].date=a;      qumax[rear1].pos=pushc1;     rear1++;pushc1++;     maxx[i1++]=qumax[front1].date;     if(qumin[front2].pos==posc2) front2++;      posc2++;     while(front2<rear2 && qumin[rear2-1].date>a)     rear2--;      qumin[rear2].date=a;     qumin[rear2].pos=pushc2;     rear2++;pushc2++;    minn[i2++]=qumin[front2].date;    }    for(j=0;j<i2;j++)        if(j==0) printf("%d",minn[j]);        else printf(" %d",minn[j]);    printf("\n");    for(j=0;j<i1;j++)    if(j==0) printf("%d",maxx[j]);    else printf(" %d",maxx[j]);    printf("\n");}int main(){    //freopen("2.txt","r",stdin);   scanf("%d %d",&n,&k);   solve();   return 0;}