篮网总冠军 @ 2024-09-24 19:45:57
#include <bits/stdc++.h>
using namespace std;
int st[5000005][25];
int main(){
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
int n,m;
cin>>n>>m;
memset(st,1e9,sizeof(st));
for(int i=1;i<=n;i++) cin>>st[i][0];
for(int j=1;j<=20;j++){
for(int i=1;i+(1<<(j-1))-1<=n;i++){
st[i][j]=min(st[i][j-1],st[i+1<<(j-1)][j-1]);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=3;j++){
cout<<st[i][j]<<" ";
}
}
for(int i=1;i<=n;i++){
if (i==1) {
cout<<0<<endl;
continue;
}
int l=max(i-m,1);
int r=i-1;
int k=log2(r-l+1);
cout<<min(st[l][k],st[r-(1<<k)+1][k])<<endl;
}
return 0;
}
by 篮网总冠军 @ 2024-09-24 19:46:33
中间那一段是调试,不用管
by igAC @ 2024-09-24 19:59:48
@Nets_Champion
memset(st,1e9,sizeof(st));
是错误的,可以用 for 或者 1e9 换成 0x3f
ST 表第二重循环的范围应该是 i+(1<<j)-1<=n
更新 st 时要注意优先级
ST 表过慢或者是你的常数过大,通过不了此题,可以尝试学习单调队列