题解:P1886 滑动窗口 /【模板】单调队列
什么!你不会单调队列就想做这道题!真是痴心妄想有勇气,看题解里没一篇暴力的,那我来水一篇吧!
注:非正解
话不多说,上代码(非正解我就不解释了)!
#include <bits/stdc++.h>
using namespace std;
const long long N=1000008;
long long n,k,a[N],da[N],xiao[N];
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n-k+1;i++){
long long maxn=a[i],minn=a[i];
if(a[i+k-1]>=da[i-1]&&i!=1){ //如果新的数>=上次窗口的最大值
da[i]=a[i+k-1];
}else if(a[i-1]!=da[i-1]&&i!=1){
da[i]=da[i-1];
}else{
for(int j=i;j<k+i;j++){
maxn=max(maxn,a[j]);
}
da[i]=maxn;
}
if(a[i+k-1]<=xiao[i-1]&&i!=1){
xiao[i]=a[i+k-1];
}else if(a[i-1]!=xiao[i-1]&&i!=1){
xiao[i]=xiao[i-1];
}else{
for(int j=i;j<k+i;j++){
minn=min(minn,a[j]);
}
xiao[i]=minn;
}
}
for(int i=1;i<=n-k+1;i++){
cout<<xiao[i]<<" ";
}
cout<<endl;
for(int i=1;i<=n-k+1;i++){
cout<<da[i]<<" ";
}
return 0;
}