求问本题可以用 st 表解 rmq 吗?

P1440 求m区间内的最小值

dyc2022 @ 2023-09-19 18:00:35

rt,好像会 mle。

#include<bits/stdc++.h>
using namespace std;
int lg[2000001],n,m;
int f[2000001][21];
main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)scanf("%d",&f[i][0]);
    lg[1]=0;
    for(int i=2;i<=n;i++)lg[i]=lg[i>>1]+1;
    for(int i=1;i<=lg[n];i++)
        for(int j=1;j<=n-(1<<i)+1;j++)
            f[j][i]=min(f[j][i-1],f[j+(1<<(i-1))][i-1]);
    printf("0\n");
    for(int i=2;i<=n;i++)
    {
        int r=i-1;
        int l=max(1,i-m);
        int LOG=lg[r-l+1];
        int ans=min(f[l][LOG],f[r-(1<<LOG)+1][LOG]);
        printf("%d\n",ans);
    }
    return 0;
}

by N_z_ @ 2023-09-19 18:07:36

应该可以利用每层独立把空间变成线性的。


by chaynflow @ 2023-09-19 18:08:27

你可能需要人为的加一点 inf 就可以了。


by Register_int @ 2023-09-19 18:17:17

@dyc2022 考虑只需要 \log(r-l+1) 这一行,你来个滚动数组就解决了。


by dyc2022 @ 2023-09-19 18:22:14

@Register_int 谢谢%


|