蒟蒻分块全WA求救命

P4168 [Violet] 蒲公英

斋藤飞鸟 @ 2018-12-11 18:06:38

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <map>
#include <vector> 
#define LL long long
using namespace std;
void read(int &n){
    int num=0,w=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-') w=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        num=num*10+ch-'0';
        ch=getchar();
    }
    n=num*w;
}
const int maxn=4e5+5,maxk=550;
int a[maxn];
int blo,bl[maxn];
int n,m; 
int id=0,v[maxn];
int f[maxk][maxk],fnum[maxk][maxk],cnt[maxn];
map <int,int> mp;
void init(){//读入预处理 
    read(n);read(m);
    blo=sqrt(n);
    for(int i=1;i<=n;i++){
        read(a[i]);
        bl[i]=(i-1)/blo+1;
        /*离散化*/
        if(mp.find(a[i])==mp.end()){
            id++;
            mp[a[i]]=id;
            v[id]=a[i];
        }
        a[i]=mp[a[i]];
    }
}
void init2(){//块 预处理 
    for(int i=1;i<=n;i+=blo){
        memset(cnt,0,sizeof(cnt));
        int zs=-1,zsnum=-1;
        for(int j=i;j<=n;j++){
            cnt[a[j]]++;
            if(cnt[a[j]]>zsnum || cnt[a[j]]==zsnum && v[a[j]]<v[zs]){
                zs=a[j];
                zsnum=cnt[a[j]];
            }
            f[bl[i]][bl[j]]=zs;
            fnum[bl[i]][bl[j]]=zsnum;
        }       

    }   
}
int query(int x,int y){
    memset(cnt,0,sizeof(cnt));
    /*暴力处理两边*/
    //左边
    for(int i=x;i<=min(y,bl[x]*blo);i++)
        cnt[a[i]]++;
    //右边
    if(bl[x]!=bl[y])
        for(int i=(bl[y]-1)*blo+1;i<=y;i++)
            cnt[a[i]]++;
    /*中间*/
    int mid=f[bl[x]+1][bl[y]-1],mnum=fnum[bl[x]+1][bl[y]-1];
    //处理
    //两边的统计 
    int ans=0,ansnum=0;
    for(int i=1;i<=id;i++)
        if(cnt[a[i]]>ansnum || cnt[a[i]]==ansnum&&v[a[i]]<v[ans]) 
            ansnum=cnt[a[i]],ans=a[i];
    //与中间比较
    if(mnum>ansnum || mnum==ansnum&&v[ans]<v[mid]) ans=mid;
    return v[ans];
}
int main(){
    init();
    init2();
    int x=0;
    while(m--){
        int l,r;read(l);read(r);
        l=(l+x-1)%n+1;r=(r+x-1)%n+1;
        if(l>r) swap(l,r);
        x=query(l,r);
        printf("%d\n",x);
    }
    return 0;
}

|