POj 2823

比较好用的就是单调队列了,时间复杂度为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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值