求调

P1440 求m区间内的最小值

篮网总冠军 @ 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

  1. \log_2n>20
  2. memset(st,1e9,sizeof(st)); 是错误的,可以用 for 或者 1e9 换成 0x3f

  3. ST 表第二重循环的范围应该是 i+(1<<j)-1<=n

  4. 更新 st 时要注意优先级

  5. ST 表过慢或者是你的常数过大,通过不了此题,可以尝试学习单调队列


|