分块样例过0pts求调

P4168 [Violet] 蒲公英

LBYYSM_123 @ 2023-09-25 13:28:16

#include<bits/stdc++.h>
using namespace std;
int n,m,q;
int a[40001];
int tmp[40001];
int she[40001];
int zf[40001];
int st[201],ed[201],bel[40001];
int f[201][201];
vector<int> dui[40001];
int last=0;
void hash_work(){
    for(int i=1;i<=n;i++)
        tmp[i]=a[i];
    sort(tmp+1,tmp+n+1);
    for(int i=1;i<=n;i++){
        int k=lower_bound(tmp+1,tmp+n+1,a[i])-tmp;
        she[k]=a[i],a[i]=k;
    }
}
void pre(int step){
    for(int i=1;i<=n;i++)
        tmp[i]=0;
    int maxx__cnt=0,maxx__ans=0;
    for(int i=st[step];i<=n;i++){
        tmp[a[i]]++;
        if(tmp[a[i]]>maxx__cnt||(tmp[a[i]]==maxx__cnt&&zf[a[i]]<zf[maxx__ans]))
            maxx__cnt=tmp[a[i]],maxx__ans=a[i];
        f[step][bel[i]]=maxx__ans;
    }
}
int cnt_sum(int l,int r,int x){
    return upper_bound(dui[x].begin(),dui[x].end(),r)-lower_bound(dui[x].begin(),dui[x].end(),l);
}
int query(int l,int r){
    if(bel[r]-bel[l]<=2){
        int maxx__cnt=0,maxx__ans=0;
        for(int i=l;i<=r;i++){
            int k=cnt_sum(l,r,a[i]);
            if(k>maxx__cnt||(k==maxx__cnt&&zf[a[i]]<zf[maxx__ans]))
                maxx__cnt=k,maxx__ans=a[i];
        }
        return maxx__ans; 
    }
    else{
        int maxx__ans=f[bel[l]+1][bel[r]-1],maxx__cnt=cnt_sum(l,r,maxx__ans);
        for(int i=l;i<=ed[bel[l]];i++){
            int k=cnt_sum(l,r,a[i]);
            if(k>maxx__cnt||(k==maxx__cnt&&zf[a[i]]<zf[maxx__ans]))
                maxx__cnt=k,maxx__ans=a[i];
        }
        for(int i=st[bel[r]];i<=r;i++){
            int k=cnt_sum(l,r,a[i]);
            if(k>maxx__cnt||(k==maxx__cnt&&zf[a[i]]<zf[maxx__ans]))
                maxx__cnt=k,maxx__ans=a[i];
        }
        return maxx__ans; 
    }
}
signed main(){
    //freopen("P4168_1.in","r",stdin);
    memset(zf,0x3f,sizeof(zf));
    cin>>n>>m;q=sqrt(n);
    for(int i=1;i<=n;i++)
        cin>>a[i];
    hash_work();
    for(int i=1;i<=n;i++)
        dui[a[i]].push_back(i),zf[a[i]]=min(zf[a[i]],i);
    for(int i=1;i<=q;i++)
        st[i]=n/q*(i-1)+1,ed[i]=n/q*i;ed[q]=n;
    for(int i=1;i<=q;i++)
        for(int j=st[i];j<=ed[i];j++)
            bel[j]=i;
    for(int i=1;i<=q;i++)
        pre(i);
    for(int i=1;i<=m;i++){
        int l,r;
        cin>>l>>r;
        l=(l+last-1)%n+1;
        r=(r+last-1)%n+1;
        if(l>r)swap(l,r);
        int ans=query(l,r);
        cout<<she[ans]<<'\n';last=she[ans];
    }
    return 0;
} 

|