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

被折叠的 条评论
为什么被折叠?



