st表求调

P1886 滑动窗口 /【模板】单调队列

microchip @ 2023-06-27 16:35:24

尝试用st表,一开始用cin和cout导致3个点1.01s超时

然后试了试用scanf和printf,就RE了

如果不是越界,还有什么问题呢

如果你建议我用单调队列......我不会QAQ

代码:

#include<bits/stdc++.h>
using namespace std;

int n,k,a[1000050],st[1000050][20],LOG[1000050];

int pow(int A,int B){
    int ret=1;
    while(B--){
        ret*=A;
    }return ret;
}

int find_min(int A,int B){
    return min(st[A][LOG[B-A+1]],st[B-pow(2,LOG[B-A+1])+1][LOG[B-A+1]]);
}

int find_max(int A,int B){
    return max(st[A][LOG[B-A+1]],st[B-pow(2,LOG[B-A+1])+1][LOG[B-A+1]]);
}

int main()
{
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        for(int j=0;j<=log2(n);j++){
            st[i][j]=99999999;
        }
    }
    for(int i=1;i<=n;i++){
        cin>>a[i];
        st[i][0]=a[i];
        LOG[i]=log2(i);
    }for(int j=1;j<=LOG[n];j++)
        for(int i=1;i<=n;i++)
            st[i][j]=min(st[i][j-1],st[i+pow(2,j-1)][j-1]);
    for(int i=1;i<=n-k+1;i++){
        cout<<find_min(i,i+k-1)<<' ';
    }cout<<endl;
    for(int i=1;i<=n;i++){
        for(int j=0;j<=log2(n);j++){
            st[i][j]=-99999999;
        }
    }for(int i=1;i<=n;i++){
        st[i][0]=a[i];
    }for(int j=1;j<=LOG[n];j++)
        for(int i=1;i<=n;i++)
            st[i][j]=max(st[i][j-1],st[i+pow(2,j-1)][j-1]);
    for(int i=1;i<=n-k+1;i++){
        cout<<find_max(i,i+k-1)<<' ';
    }
    return 0;
}

by microchip @ 2023-06-27 17:33:15

不太懂为什么一定要把st开到[1500000][20]才不会越界


by whssy @ 2023-08-13 21:47:40

st表不慢 https://www.luogu.com.cn/record/120730766 @microchip


上一页 |