这题洛谷上也有:https://www.luogu.org/problem/show?pid=1886#sub
考完省选颓了好几天,终于写博客了,也是纠结.
洛谷上过了我是不会说poj上TLE了的
Code:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fod(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
const int N=1e6+10;
int read(){
bool flag=0;
char p=' ';int x=0;
while(!(p>='0'&&p<='9')&&p!='-') p=getchar();
if(p=='-') flag=1,p=getchar();
while(p>='0'&&p<='9') x=x*10+p-'0',p=getchar();
if(flag) return -x;
return x;
}
struct queue{
int val[N],pos[N];
int head,tail;
void init() {head=1;tail=1;}
};
queue minq,maxq;
int n,k;
int minans[N],maxans[N];
int main(){
scanf("%d%d",&n,&k);
int num;
maxq.init();
minq.init();
fo(i,1,k)
{
num=read();
while(minq.tail>minq.head&&num<=minq.val[minq.tail-1]) minq.tail--;
minq.val[minq.tail]=num;
minq.pos[minq.tail++]=i;
while(maxq.tail>maxq.head&&maxq.val[maxq.tail-1]<=num) maxq.tail--;
maxq.val[maxq.tail]=num;
maxq.pos[maxq.tail++]=i;
}
int cur=1;
fo(i,k+1,n)
{
minans[cur]=minq.val[minq.head];
maxans[cur++]=maxq.val[maxq.head];
num=read();
while(minq.tail>minq.head&&i-k>=minq.pos[minq.head]) minq.head++;
while(minq.tail>minq.head&&num<=minq.val[minq.tail-1]) minq.tail--;
minq.val[minq.tail]=num;
minq.pos[minq.tail++]=i;
while(maxq.tail>maxq.head&&i-k>=maxq.pos[maxq.head]) maxq.head++;
while(maxq.tail>maxq.head&&num>=maxq.val[maxq.tail-1]) maxq.tail--;
maxq.val[maxq.tail]=num;
maxq.pos[maxq.tail++]=i;
}
minans[cur]=minq.val[minq.head];
maxans[cur]=maxq.val[maxq.head];
fo(i,1,cur)
printf("%d ",minans[i]); printf("\n");
fo(i,1,cur)
printf("%d ",maxans[i]);
return 0;
}