如何将ST表的大小开小

P3793 由乃救爷爷

Prean @ 2020-03-26 16:15:13

#include<iostream>
unsigned long long ans,st[4460][15],a[20000005],s[20000005][15];
int n,m,q,p,t,l[4460],x[4460],y[4460],bl[20000005];
namespace GenHelper
{
    unsigned z1,z2,z3,z4,b;
    unsigned rand_()
    {
    b=((z1<<6)^z1)>>13;
    z1=((z1&4294967294U)<<18)^b;
    b=((z2<<2)^z2)>>27;
    z2=((z2&4294967288U)<<2)^b;
    b=((z3<<13)^z3)>>21;
    z3=((z3&4294967280U)<<7)^b;
    b=((z4<<3)^z4)>>12;
    z4=((z4&4294967168U)<<13)^b;
    return (z1^z2^z3^z4);
    }
}
void srand(unsigned x)
{using namespace GenHelper;
z1=x; z2=(~x)^0x233333333U; z3=x^0x1234598766U; z4=(~x)+51;}
int read()
{
    using namespace GenHelper;
    int a=rand_()&32767;
    int b=rand_()&32767;
    return a*32768+b;
}
inline unsigned long long ask(int L,int R)
{
    if(L>R)return 0;int k=l[R-L+1];
    return std::max(s[L][k],s[R+1-(1<<k)][k]);
}
inline unsigned long long Ask(int L,int R)
{
    if(L>R)std::swap(L,R);unsigned long long ans=0;
    if(bl[L]==bl[R])return ask(L,R);
    int k=l[bl[R]-bl[L]+1],s=bl[L]*p,t=(bl[R]-1)*p+1;
    ans=std::max(st[bl[L]+1][k],st[bl[R]-2-(1<<k)][k]);
    ans=std::max(ans,ask(L,y[bl[L]]));
    ans=std::max(ans,ask(x[bl[R]],R));
    return ans;
}
main()
{
    int i,j,k;std::cin>>n>>m>>q;srand(q);p=4480;
    for(i=1;i<=n;++i)
    {
        a[i]=read();bl[i]=i/p+1;t=bl[n];
        st[bl[i]][0]=std::max(st[bl[i]][0],a[i]);
    }t=bl[n];for(i=1;i<=t;++i)x[i]=(i-1)*p,y[i]=x[i]+p-1;
    x[1]=1;y[t]=n;for(i=1;i<=p;++i)l[i]=l[i-1]+((1<<l[i-1])==i);
    for(j=1;(1<<j)<=t;++j)for(i=1;i+(1<<j)-1<=t;++i)
    st[i][j]=std::max(st[i][j-1],st[i+(1<<j-1)][j-1]);
    for(j=1;(1<<j)<=p;++j)for(i=1;i+(1<<j)-1<=n;++i)
    s[i][j]=std::max(s[i][j-1],s[i+(1<<j-1)][j-1]);
    while(m--)ans+=Ask(read()%n+1,read()%n+1);std::cout<<ans;
}

连本地都出了问题,还有优化空间的方法吗QAQ


by Prean @ 2020-03-26 16:41:26

就是为了O(1)求每一块的最值


by FZzzz @ 2020-03-26 16:44:13

@limaopipi2022 每一块不用 st 表啊,你要是每一块都建一个 st 表那还不如直接暴力 st 表

记一下块的前后缀最小值就行了


by Alex_Wei @ 2020-03-26 16:44:38

@limaopipi2022 块内不需要 ST 表。。。数据随机所以在同一块直接暴力查询就行了啊


by Prean @ 2020-03-26 16:49:03

我块内搞成暴力了。。。。。。

所以有了一个TLE的算法。。。


by arfa @ 2020-03-26 17:01:26

@limaopipi2022 看看最下面 https://www.luogu.com.cn/blog/acking/The-end-for-my-OI


by Prean @ 2020-03-26 18:08:11

@function_of_zero @Alex_Wei 谢谢,我现在80分了,在卡常


by Prean @ 2020-03-26 18:08:31

还有@arfa


上一页 |