解析:
显然又是 DP D P 。
考虑单调队列优化。
对于最大值,队列里面保存当前位置前
k
k
个中的递减序列,每次查队首,改队尾就行了。
最小值类似处理。
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define re register
#define gc getchar
#define pc putchar
#define cs const
#define st static
inline
ll getint(){
re ll num=0;
re char c;
re bool f=0;
while(!isdigit(c=gc()))if(c=='-')f=1;
while(isdigit(c))num=(num<<1)+(num<<3)+(c^48),c=gc();
return f?-num:num;
}
inline
void outint(int a){
st char ch[13];
if(a==0)pc('0');
if(a<0)pc('-'),a=-a;
while(a)ch[++ch[0]]=(a-a/10*10)^48,a/=10;
while(ch[0])pc(ch[ch[0]--]);
}
int n,k;
int a[1000002];
int q[1000002],head,tail;
int maxn[1000002],minn[1000002];
inline
void getmax(){
head=1,tail=0;
for(int re i=1;i<=n;++i){
while(q[head]<=i-k&&head<=tail)++head;
while(a[i]<=a[q[tail]]&&head<=tail)--tail;
q[++tail]=i;
minn[i]=a[q[head]];
}
}
inline
void getmin(){
head=1,tail=0;
for(int re i=1;i<=n;++i){
while(q[head]<=i-k&&head<=tail)++head;
while(a[i]>=a[q[tail]]&&head<=tail)--tail;
q[++tail]=i;
maxn[i]=a[q[head]];
}
}
int main(){
n=getint();
k=getint();
for(int re i=1;i<=n;++i){
a[i]=getint();
}
getmax();
getmin();
for(int re i=k;i<=n;++i)outint(minn[i]),pc(' ');pc('\n');
for(int re i=k;i<=n;++i)outint(maxn[i]),pc(' ');pc('\n');
return 0;
}