蒟蒻求助,分块10分

P4168 [Violet] 蒲公英

张凯_巨大 @ 2022-01-12 19:43:26

rt,调了一天了,还是只有十分。 (除17,18外全部WA)

#include<iostream>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
int vl[500010],v2[500010];
int v3[500010];
int ds;
int n,m,bl;
int ord[500010];
int vs[210][500010],mx[210],mv[210];
bool cmp(int x,int y)
{
    return  vl[x]<vl[y];
}
int q[500010],t[500010];
int getmx(int il,int ir,int qs)
{
    int ret=0,r2;
    for(int i=il;i<=ir;i++)
    {
        if(q[v2[i]]!=qs)
        {
            q[v2[i]]=qs;
            t[v2[i]]=0;
        }
        t[v2[i]]++;
        if(t[v2[i]]>ret||t[v2[i]]==ret&&v2[i]<r2)
        {
            ret=t[v2[i]];
            r2=v2[i];
        }
    }
    return r2;
}
int main()
{
    cin>>n>>m;
    bl=sqrt(n);
    for(int i=1;i<=n;i++)
    {
        cin>>vl[i];
        ord[i]=i;
    }
    sort(ord+1,ord+n+1,cmp);
    for(int i=1;i<=n;i++)
    {
        if(vl[ord[i]]!=vl[ord[i-1]])
        {
            ds++;
            v3[ds]=vl[ord[i]];
        }
        v2[ord[i]]=ds;
    }
    for(int i=1;i<n/bl;i++)
    {
        for(int j=1;j<=ds;j++)
        {
            vs[i][j]+=vs[i-1][j];
        }
        for(int j=i*bl;j<i*bl+bl;j++)
        {
            vs[i][v2[j]]++;
            if(mx[i]<vs[i][v2[j]]-vs[i-1][v2[j]]||mx[i]==vs[i][v2[j]]-vs[i-1][v2[j]]&&mv[i]>v2[j])
            {
                mv[i]=v2[j];
                mx[i]=vs[i][v2[j]]-vs[i-1][v2[j]];
            }
        }
        //cout<<mv[i]<<endl;
    }
    int x=0,k,xr,y;
    while(m--)
    {
        int il,ir;
        cin>>il>>ir;
        il=(il+x-1)%n+1;
        ir=(ir+x-1)%n+1;
        if(il>ir)
        {
            swap(il,ir);
        }
        //cout<<il<<' '<<ir<<endl;
        k=0;
        if(il/bl==ir/bl)
        {
            x=getmx(il,ir,m);
        }
        else
        {
            getmx(il,il/bl*bl+bl-1,m);
            getmx(ir/bl*bl,ir,m);
            k=0;
            for(int i=il;i<il/bl*bl+bl;i++)
            {
                int tmp=t[v2[i]]+vs[ir/bl-1][v2[i]]-vs[il/bl][v2[i]];
                if(tmp>k||tmp==k&&v2[i]<x)
                {
                    x=v2[i];
                    k=tmp;
                }
            }
            for(int i=ir/bl*bl;i<=ir;i++)
            {
                int tmp=t[v2[i]]+vs[ir/bl-1][v2[i]]-vs[il/bl][v2[i]];
                if(tmp>k||tmp==k&&v2[i]<x)
                {
                    x=v2[i];
                    k=tmp;
                }
            }
            for(int i=il/bl+1;i<ir/bl;i++)
            {
                xr=mv[i];
                y=vs[ir/bl-1][xr]-vs[il/bl][xr];
                //cout<<y<<' '<<xr<<endl;
                if(k<y||y==k&&xr<x)
                {
                    x=xr;
                    k=y;
                }
            }
        }
        x=v3[x];
        cout<<x<<endl;
    }
    return 0;
}

|