题目
题意: 给你长度为n的序列,有一个长度为k的滑动窗口,输出n-k个值滑动窗口移动时的最小值 和n-k个移动时的最大值。
思路: 对于第一中来说 位置靠前但值还大的应该被淘汰。
#include<cstdio>
using namespace std;
const int N=1e6+5;
int a[N],q[N],n,k;
void workmin(){
int head=1,tail=0,i=1;
for(;i<k;++i){
while(head<=tail&&a[q[tail]]>a[i]) --tail;
q[++tail]=i;
}
for(;i<=n;++i){
if(q[head]<=i-k) ++head;
while(head<=tail&&a[q[tail]]>a[i]) --tail;
q[++tail]=i;
printf("%d%c",a[q[head]],(i==n)?'\n':' ');
}
}
void workmax(){
int head=1,tail=0,i=1;
for(;i<k;++i){
while(head<=tail&&a[q[tail]]<a[i]) --tail;
q[++tail]=i;
}
for(;i<=n;++i){
if(q[head]<=i-k) ++head;
while(head<=tail&&a[q[tail]]<a[i]) --tail;
q[++tail]=i;
printf("%d%c",a[q[head]],(i==n)?'\n':' ');
}
}
int main(){
while(~scanf("%d%d",&n,&k)){
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
if(k==1){
for(int i=1;i<=n;++i) printf("%d%c",a[i],(i==n)?'\n':' ');
for(int i=1;i<=n;++i) printf("%d%c",a[i],(i==n)?'\n':' ');
}
else workmin(),workmax();
}
}