分块过样例,WA+TLE求调

P4168 [Violet] 蒲公英

wangif424 @ 2024-07-10 09:31:26


#include <bits/stdc++.h>
#define R(x) x = read()
#define ENDL push('\n');
#define SPACE push(' ');
#define int long long
using namespace std;
char pbuf[1<<20], *pp=pbuf;
inline void push(const char &c) {
    if(pp - pbuf == 1<<20)fwrite(pbuf, 1, 1<<20, stdout),pp = pbuf;
    *pp++ = c;
}
class io {public:~io() {fwrite(pbuf, 1, pp - pbuf, stdout);}} _;
inline void write(int x) {
    if (x<0)x=-x,push('-');
    int sta[35],top=0;
    do {
        sta[top++]=x%10,x/=10;
    } while (x);
    while(top)push(sta[--top]^'0');
}
#ifndef LOCAL
    char buf[1<<23],*p1=buf,*p2=buf;
    #define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
#endif
inline int read() {
    int x=0,f=1;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
    while(isdigit(ch)) x=x*10+(ch^48),ch=getchar();
    return x*f;
}
constexpr int N=80010,B=410;
int n,m;
int a[N],la[N];
int b,bl[N],lb[B],rb[B];
int cnt[B][N],tmp[N],ans[B][B],x;
signed main(){
    R(n);R(m);
    b=ceil(sqrt(n));
    for(int i=1;i<=n;i++){
        bl[i]=(i-1)/b+1;
    }
    for(int i=1;i<=n;i++){
        if(bl[i]!=bl[i+1])rb[bl[i]]=i;
        if(bl[i]!=bl[i-1])lb[bl[i]]=i;
    }
    for(int i=1;i<=n;i++)R(la[i]=a[i]);
    sort(la+1,la+1+n);
    for(int i=1;i<=n;i++)a[i]=lower_bound(la+1,la+1+n,a[i])-la;
    for(int i=1;i<=n;i++)cnt[bl[i]][a[i]]++;
    for(int i=1;i<=bl[n];i++)for(int j=1;j<=n;j++)cnt[i][j]+=cnt[i-1][j];
    for(int i=1;i<=bl[n];i++){
        int res=0;
        for(int j=i;j<=bl[n];j++){
            for(int k=lb[j];k<=rb[j];k++){
                tmp[a[k]]++;
                if(tmp[a[k]]>tmp[res]||(tmp[a[k]]==tmp[res]&&a[k]<res)){
                    res=a[k];
                }
            }
            ans[i][j]=res;
        }
        for(int k=1;k<=n;k++)tmp[a[k]]=0;
    }
    for(int _=1;_<=m;_++){
        int l,r;
        R(l);R(r);
        l=(l+x-1)%n+1;
        r=(r+x-1)%n+1;
        if(l>r)l^=r^=l^=r;
        if(bl[r]-bl[l]<=1){
            int res=0;
            for(int i=l;i<=r;i++){
                tmp[a[i]]++;
                if(tmp[a[i]]>tmp[res]||(tmp[a[i]]==tmp[res]&&a[i]<res)){
                    res=a[i];
                }
            }
            for(int i=l;i<=r;i++)tmp[a[i]]--;
            write(x=la[res]);push('\n');
        }else{
            int res=ans[bl[l]+1][bl[r]-1];
            for(int i=l;i<=rb[bl[l]];i++){
                tmp[a[i]]++;
                int c=tmp[a[i]]+cnt[bl[r]-1][a[i]]-cnt[bl[l]][a[i]];
                int t=tmp[res] +cnt[bl[r]-1][res] -cnt[bl[l]][res];
                if(c>t||(c==t&&a[i]<res)){
                    res=a[i];
                }
            }
            for(int i=lb[bl[r]];i<=r;i++){
                tmp[a[i]]++;
                int c=tmp[a[i]]+cnt[bl[r]-1][a[i]]-cnt[bl[l]][a[i]];
                int t=tmp[res] +cnt[bl[r]-1][res] -cnt[bl[l]][res];
                if(c>t||(c==t&&a[i]<res)){
                    res=a[i];
                }
            }
            for(int i=l;i<=rb[bl[i]];i++)tmp[a[i]]--;
            for(int i=lb[bl[i]];i<=r;i++)tmp[a[i]]--;
            write(x=la[res]);push('\n');
        }
    }
    return 0;
}
``

|