前言:好久没写滑动窗口,导致一些边界问题处理不好,back和top的初始值都搞不好
#include<bits/stdc++.h>
using namespace std;
const int N = (int)1e6+5;
int n,m;
int a[N],b[N];
int back,top;
int main(){
cin >> n >> m;
for(int i=1;i<=n;i++){
cin >> a[i];
}
top = -1;
for(int i=1;i<m;i++){
while(back<=top){
if(a[b[top]]>=a[i]) top--;
else break;
}
b[++top] = i; // 入栈
}
for(int i=m;i<=n;i++){
int u = a[i];
while(back<=top){
if(a[b[top]]>=a[i]) top--;
else break;
}
b[++top] = i;
while(1){
if(i-b[back]>=m) back++;
else {
cout << a[b[back]] << endl; break;
}
}
}
return 0;
}
我们还可以用st表
#include<bits/stdc++.h>
using namespace std;
const int N = (int)1e6+5;
int a[N][21];
int n,m;
void ini(){
for(int i=1;i<=n;i++){
cin >> a[i][0];
}
int len = log2(n);
for(int i=1;i<=len;i++){
for(int j=1;j<=(n-(1<<i))+1;j++){
a[j][i] = min(a[j][i-1],a[j+(1<<(i-1))][i-1]);
}
}
}
int query(int l,int r){
int len = log(r-l+1);
return min(a[l][len],a[r-(1<<len)+1][len]);
}
int main(){
cin >> n >> m;
ini();
for(int i=m;i<=n;i++){
cout << query(i-m+1,i) << endl;
}
return 0;
}