单调队列实现询问最小值与最大值
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn=1e6+6;
int a[maxn],b[maxn],c[maxn],que[maxn],pos[maxn];
int n,k;
void Get_min(){//单调队列求每连续k个数的最小值
int head=1,tail=0;
int i;
for(i=0;i<k-1;i++){
while(head<=tail && que[tail]>=a[i])
--tail;
que[++tail]=a[i];
pos[tail]=i;
}
for(;i<n;i++){
while(head<=tail && que[tail]>=a[i])
--tail;
que[++tail]=a[i];
pos[tail]=i;
while(pos[head]<i-k+1){
head++;
}
b[i-k+1]=que[head];
}
}
void Get_max(){//单调队列求每连续k个数的最大值
int head=1,tail=0;
int i;
for(i=0;i<k-1;i++){
while(head<=tail && que[tail]<=a[i])
--tail;
que[++tail]=a[i];
pos[tail]=i;
}
for(;i<n;i++){
while(head<=tail && que[tail]<=a[i])
--tail;
que[++tail]=a[i];
pos[tail]=i;
while(pos[head]<i-k+1){
head++;
}
c[i-k+1]=que[head];
}
}
int main(int argc, char const *argv[])
{
while(~scanf("%d %d",&n,&k)){
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
Get_min();
Get_max();
for(int i=0;i<=n-k;i++){
printf("%d%c",b[i],i==n-k?'\n':' ');
}
for(int i=0;i<=n-k;i++){
printf("%d%c",c[i],i==n-k?'\n':' ');
}
}
return 0;
}