#include<iostream> /// C++ AC G++ WA
#include<cstdio>
#include<algorithm>
#include<stdlib.h>
using namespace std;
#define MAX 1000001
int n,k,q[MAX],a[MAX],f[MAX];
int _max[MAX],_min[MAX];
void min_()
{
int i,head=1,tail=0;
for(i=1;i<k;i++){ /// 前k-1个入队
while(head<=tail&&a[i]<=q[tail]) /// or a[i] < q[tail]
tail--;
q[++tail]=a[i];
f[tail]=i;
}
for(;i<=n;i++){
while(head<=tail&&a[i]<=q[tail])
tail--;
q[++tail]=a[i];
f[tail]=i;
while(f[head]<i-k+1) head++;
_min[i-k+1]=q[head];
}
}
void max_()
{
int i,head=1,tail=0;
for(i=1;i<k;i++){
while(head<=tail&&a[i]>=q[tail])
tail--;
q[++tail]=a[i];
f[tail]=i;
}
for(;i<=n;i++){
while(head<=tail&&a[i]>=q[tail])
tail--;
q[++tail]=a[i];
f[tail]=i;
while(f[head]<i-k+1) head++;
_max[i-k+1]=q[head];
}
}
void outmin()
{
for(int i=1;i<=n-k+1;i++)
{
printf("%d",_min[i]);
if(i!=n-k+1) printf(" ");
else printf("\n");
}
}
void outmax()
{
for(int i=1;i<=n-k+1;i++)
{
printf("%d",_max[i]);
if(i!=n-k+1) printf(" ");
else printf("\n");
}
}
int main()
{
int i;
scanf("%d%d",&n,&k);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
min_();
max_();
outmin();
outmax();
return 0;
}
poj 2823 单调对列
最新推荐文章于 2019-04-27 18:22:45 发布