萌新刚学OI,分块0pts全WA求助

P4168 [Violet] 蒲公英

_ChongYun_ @ 2024-06-28 08:36:06

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,q,l,r,T,len;
int HAM_qwq[1111][1111];
int a[40005],b[40005],cnt[40005],ans=0;
int pos[40005],L[1111],R[1111];
vector<int> qwq[40005];
int read(){
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){ 
        if(ch=='-') f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<3)+(x<<1)+ch-'0';
        ch=getchar();
    }
    return x*f;
}
int logg(int x){
    if(x==1) return 0;
    int qq=1;
    for(int i=1;i<=30;i++){
        qq*=2;
        if(qq>x) return i-1;
    }
    return 1;
}
void init(int x){
    int maxx=0,qans=0;
    for(int i=L[x];i<=n;i++){
        cnt[a[i]]++;
        if(cnt[a[i]]>maxx||(cnt[a[i]]==maxx&&b[a[i]]<b[qans])){
            qans=a[i];
            maxx=cnt[a[i]];
        }
        HAM_qwq[x][pos[i]]=qans;
    }
    for(int i=1;i<=n;i++) cnt[i]=0;
    return ;
}
int qwq_(int x,int ll,int rr){
    int l=0,r=qwq[x].size()-1,qans=0,qqans=0,mid;
    while(l<=r){
        mid=(l+r)>>1;
        if(qwq[x][mid]>=ll){
            qans=mid;
            r=mid-1;
        }
        else l=mid+1;
    }
    l=0,r=qwq[x].size()-1,qans=0,mid;
    while(l<=r){
        mid=(l+r)>>1;
        if(qwq[x][mid]<=rr){
            qqans=mid;
            l=mid+1;
        }
        else r=mid-1;
    }
    return qqans-qans+1;
}
int query(int l,int r){
    int maxx=0,qans=0;
    int p=pos[l],q=pos[r];
    if(p==q){
        for(int i=l;i<=r;i++){
            int qq=qwq_(a[i],l,r);
            if(qq>maxx||(qq==maxx&&b[a[i]]<b[qans])){
                qans=a[i];
                maxx=qq;
            }
        }
        return b[qans];
    }
    qans=HAM_qwq[p+1][q-1];
    maxx=qwq_(qans,p+1,q-1);
    for(int i=l;i<=R[p];i++){
        int qq=qwq_(a[i],l,r);
        if(qq>maxx||(qq==maxx&&b[a[i]]<b[qans])){
            qans=a[i];
            maxx=qq;
        }
    }
    for(int i=L[q];i<=r;i++){
        int qq=qwq_(a[i],l,r);
        if(qq>maxx||(qq==maxx&&b[a[i]]<b[qans])){
            qans=a[i];
            maxx=qq;
        }
    }
    return b[qans];
}
signed main(){
    n=read(); q=read();
    for(int i=1;i<=n;i++) a[i]=read();
    for(int i=1;i<=n;i++) b[i]=a[i];    
    T=sqrt(n*logg(n)); len=n/T;
    for(int i=1;i<=T;i++){
        if(i*len>n) break;
        L[i]=(i-1)*len+1;
        R[i]=i*len;
    }
    if(R[T]<n){ ++T; L[T]=R[T-1]+1; R[T]=n; }
    for(int i=1;i<=T;i++){
        for(int j=L[i];j<=R[i];j++) pos[j]=i;
    }
    sort(b+1,b+n+1);
    int o=unique(b+1,b+n+1)-b-1;
    for(int i=1;i<=n;i++) a[i]=lower_bound(b+1,b+o+1,a[i])-b;
    for(int i=1;i<=n;i++) qwq[a[i]].push_back(i);
    for(int i=1;i<=T;i++) init(i);
    while(q--){
        int l0,r0;
        l0=read(); r0=read();
        l=(l0+ans-1)%n+1; 
        r=(r0+ans-1)%n+1;
        if(l>r) swap(l,r);
        ans=query(l,r);
        printf("%lld\n",ans);
    }
    return 0;
}

by tmp_get_zip_diff @ 2024-06-28 08:39:35

@HAM_qwq 刚学 OI 就会分块了,%%%


by huyangmu @ 2024-06-28 09:24:24

@HAM_qwq


by _ChongYun_ @ 2024-06-28 10:01:37

我是傻子。

qwq_ 中写了一句 qans=0 ,将已经二分结束的qans重新赋值,导致最终答案错误。


by minVan @ 2024-06-28 10:01:41

傻子期


by 20111019Yu @ 2024-06-28 10:03:01

满满的问题


|