再次求助回滚莫队,94ptsWA最后一个点
查看原帖
再次求助回滚莫队,94ptsWA最后一个点
444040
Echoternity楼主2022/8/11 08:10

下下来数据之后比对发现是对的,结果交上去就全部输出 00 了。

const int MAXN=2e5+10;
int N,M,Val[MAXN],Uni,Cnt;
int Lst[MAXN],Nxt[MAXN],ans[MAXN],St[MAXN];
struct query
{
    int l,r,id;
    bool operator<(const query &x) const
    {
        if(l/Uni!=x.l/Uni) return l<x.l;
        return r<x.r;
    }
}Q[MAXN];
int Ch[MAXN],Tot,Nums[MAXN];
inline int calc(int l,int r)
{
    int res=0;
    for(int i=l;i<=r;++i) Lst[Val[i]]=0;
    for(int i=l;i<=r;++i)
        if(!Lst[Val[i]]) Lst[Val[i]]=i;
        else res=std::max(res,i-Lst[Val[i]]);
    return res;
}
inline int get(int x)
{
    return (x/Uni)+1;
}
inline void Solve()
{
    std::sort(Q+1,Q+1+M);
    for(int i=1,j=1;j<=Cnt;++j)
    {
        int br=std::min(N,j*Uni),l=br+1,r=l-1,res=0;
        Tot=0;
        for(;get(Q[i].l)==j;++i)
        {
            auto q=Q[i];
            if(get(q.r)==j)
            {
                ans[q.id]=calc(q.l,q.r);
                continue;
            }
            while(r<q.r)
            {
                ++r;Nxt[Val[r]]=r;
                if(!St[Val[r]]) St[Val[r]]=r,Ch[++Tot]=Val[r];
                res=std::max(res,r-St[Val[r]]);
            }
            int backup=res;
            while(l>q.l)
            {
                --l;
                if(Nxt[Val[l]]) res=std::max(res,Nxt[Val[l]]-l);
                else Nxt[Val[l]]=l;
            }
            ans[q.id]=res;
            while(l<=br)
            {
                if(Nxt[Val[l]]==l) Nxt[Val[l]]=0;
                ++l;
            }
            res=backup;
        }
        for(int i=1;i<=Tot;++i) Nxt[Ch[i]]=St[Ch[i]]=0;
    }
}
int main()
{
    // freopen("backup_mo_algo.in","r",stdin);
    // freopen("backup_mo_algo.out","w",stdout);
    read(N);
    for(int i=1;i<=N;++i) read(Val[i]),Nums[i]=Val[i];
    std::sort(Nums+1,Nums+1+N);
    int len=std::unique(Nums+1,Nums+1+N)-Nums-1;
    for(int i=1;i<=N;++i) Val[i]=std::lower_bound(Nums+1,Nums+1+len,Val[i])-Nums;
    read(M);
    Uni=std::sqrt(N);
    Cnt=(N-1)/Uni+1;
    for(int i=1;i<=M;++i)
    {
        read(Q[i].l,Q[i].r);
        Q[i].id=i;
    }
    Solve();
    for(int i=1;i<=M;++i) write(ans[i]),puts("");
    return 0;
}
/*
8
1 6 2 2 3 3 1 6
5
1 4
2 5
2 8
5 6
1 7
*/
2022/8/11 08:10
加载中...