吹不动蒲公英

P4168 [Violet] 蒲公英

Ew_Cors @ 2022-10-02 20:04:59

RT,不知道是什么原因只过了三个点涅,剩余都是 WA,时间很宽裕!

代码如下:

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

int n,m,a[40005],b[40005];

int l[205],r[205],cob,lob;
int s[205][40005],c[205][205];

int tmp[40005];

int main(){

    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        b[i]=a[i];
    }
    sort(b+1,b+n+1);
    int ctmp=unique(b+1,b+n+1)-b-1;
    for(int i=1;i<=n;i++)
        a[i]=lower_bound(b+1,b+ctmp+1,a[i])-b;

    lob=floor(sqrt(n));
    for(;r[cob]<n;cob++)
        l[cob+1]=cob*lob+1,
        r[cob+1]=(cob+1)*lob;
    cob--;
    r[cob]=n;

    for(int i=1;i<=cob;i++){
        for(int j=1;j<=n;j++)
            s[i][j]=s[i-1][j];
        for(int j=l[i];j<=r[i];j++)
            s[i][a[j]]++;
    }

    for(int i=1;i<=cob;i++){
        int id=0;
        for(int j=i;j<=cob;j++){
            for(int k=l[j];k<=r[j];k++){
                tmp[a[k]]++;
                if(tmp[a[k]]>tmp[id]
                ||(tmp[a[k]]==tmp[id] && a[k]<id))
                    id=a[k];
            }
            c[i][j]=id;
        }
        memset(tmp,0,sizeof tmp);
    }

    for(int i=1,L,R,lst=0;i<=m;i++){
        cin>>L>>R;
        L=(L-1+lst)%n+1,R=(R-1+lst)%n+1;
        if(L>R)swap(L,R);

        int lb=(L-1)/lob+1,rb=(R-1)/lob+1;

        int id=0;

        if(rb-lb<=1){
            for(int k=L;k<=R;k++){
                tmp[a[k]]++;
                if(tmp[a[k]]>tmp[id]
                ||(tmp[a[k]]==tmp[id] && a[k]<id))
                    id=a[k];
            }
            for(int k=L;k<=R;k++)
                tmp[a[k]]=0;
        }
        else{
            for(int k=L;k<=r[lb];k++){
                if(!tmp[a[k]])
                    tmp[a[k]]=s[rb-1][a[k]]-s[lb][a[k]];
                tmp[a[k]]++;
                if(tmp[a[k]]>tmp[id]
                ||(tmp[a[k]]==tmp[id] && a[k]<id))
                    id=a[k];
            }
            for(int k=l[rb];k<=R;k++){
                if(!tmp[a[k]])
                    tmp[a[k]]=s[rb-1][a[k]]-s[lb][a[k]];
                tmp[a[k]]++;
                if(tmp[a[k]]>tmp[id]
                ||(tmp[a[k]]==tmp[id] && a[k]<id))
                    id=a[k];
            }

            int clr=c[lb+1][rb-1];
            if(!tmp[clr])tmp[clr]=s[rb-1][clr]-s[lb][clr];
            if(tmp[clr]>tmp[id]
            ||(tmp[clr]==tmp[id] && clr<id))
                id=clr;

            tmp[clr]=0;
            for(int k=L;k<=r[lb];k++)
                tmp[a[k]]=0;
            for(int k=l[rb];k<=R;k++)
                tmp[a[k]]=0;
        }

        cout<<(lst=b[id])<<endl;
    }
    return 0;
}

by Ew_Cors @ 2022-10-02 20:15:46

怎么没有人帮我吹!!!!!!!!!!!!!!!!!!


by Ew_Cors @ 2022-10-02 20:22:38

没事了,块数量多减了一。


|