求挑错

P4168 [Violet] 蒲公英

OranJun @ 2020-02-02 08:42:25


/*Code by Codercjh*/
#include<bits/stdc++.h>
#define fr(i,a,b) for(int i=(a);i<=(b);++i)
#define rf(i,a,b) for(int i=(a);i>=(b);--i)
#define min(a,b) (a<b?a:b)
#define max(a,b) (a>b?a:b)
using namespace std;
typedef long long ll;
template<typename T>
inline void read(T &x){
    char c=getchar();T fh=0;bool f=false;
    while(!isdigit(c))f|=(c=='-'),c=getchar();
    while(isdigit(c))fh=(fh<<1)+(fh<<3)+(c^48),c=getchar();
    x=f?-fh:fh;
    return;
}
const int N=4e4+5;
const int M=5e4+5;
struct node{int rk,s;}a[N];
int l[205],r[205],b[N];
int n,m,sz,pos[N],rank[N],cnt[N],p[205][205],s[205][N];
int main(){
    freopen("fenkuai.in","r",stdin);
    read(n),read(m);
    sz=sqrt(n);
    fr(i,1,n)read(a[i].s),b[i]=a[i].s;
    fr(i,1,n/sz+1){
        l[i]=r[i-1]+1,r[i]=min(i*sz,n);
        fr(j,l[i],r[i])
         pos[j]=i;
    }
    sort(b+1,b+n+1);
    int tot=unique(b+1,b+n+1)-b-1;
    fr(i,1,n)a[i].rk=lower_bound(b+1,b+tot+1,a[i].s)-b,rank[a[i].rk]=a[i].s;
    fr(le,1,sz){
        fr(ri,le,sz){
            int zs=0;
            fr(i,l[ri],r[ri]){
                ++cnt[a[i].rk];
                if(cnt[a[i].rk]>cnt[zs])zs=a[i].rk;
                else if(cnt[a[i].rk]==cnt[zs]&&zs>a[i].rk)zs=a[i].rk; 
            }
            p[le][ri]=zs;
        }   
        fr(i,1,tot)cnt[i]=0;
    }
    fr(i,1,sz){
        fr(j,1,tot)
            s[i][j]=s[i-1][j];
        fr(j,l[i],r[i])
            ++s[i][a[j].rk];
    }
    int l0,r0,x=0,sum;
    while(m--){
        read(l0),read(r0);
        l0=(l0+rank[x]-1)%n+1,r0=(r0+rank[x]-1)%n+1;
        x=sum=0;
        if(l0>r0)swap(l0,r0);
        if(pos[r0]-pos[l0]<=1){
            fr(i,l0,r0)++cnt[a[i].rk];
            fr(i,l0,r0)
             if(cnt[a[i].rk]>cnt[x])x=a[i].rk;
             else if(cnt[a[i].rk]==cnt[x]&&x>a[i].rk)x=a[i].rk;
            printf("%d\n",rank[x]);
            fr(i,l0,r0)--cnt[a[i].rk];
        }
        else{
            fr(i,l0,r[pos[l0]])++cnt[a[i].rk];
            fr(i,l[pos[r0]],r0)++cnt[a[i].rk];
            fr(i,l0,r[pos[l0]])
                if(cnt[a[i].rk]+s[pos[r0]-1][a[i].rk]-s[pos[l0]][a[i].rk]>sum)
                 sum=cnt[a[i].rk]+s[pos[r0]-1][a[i].rk]-s[pos[l0]][a[i].rk],x=a[i].rk;
                else if(cnt[a[i].rk]+s[pos[r0]-1][a[i].rk]-s[pos[l0]][a[i].rk]==sum&&a[i].rk<x)x=a[i].rk;
            fr(i,l[pos[r0]],r0)
                if(cnt[a[i].rk]+s[pos[r0]-1][a[i].rk]-s[pos[l0]][a[i].rk]>sum)
                 sum=cnt[a[i].rk]+s[pos[r0]-1][a[i].rk]-s[pos[l0]][a[i].rk],x=a[i].rk;
                else if(cnt[a[i].rk]+s[pos[r0]-1][a[i].rk]-s[pos[l0]][a[i].rk]==sum&&a[i].rk<x)x=a[i].rk;
            if(sum<cnt[p[pos[l0]+1][pos[r0]-1]]+s[pos[r0]-1][p[pos[l0]+1][pos[r0]-1]]-s[pos[l0]][p[pos[l0]+1][pos[r0]-1]])x=p[pos[l0]+1][pos[r0]-1];
            else if(sum==cnt[p[pos[l0]+1][pos[r0]-1]]+s[pos[r0]-1][p[pos[l0]+1][pos[r0]-1]]-s[pos[l0]][p[pos[l0]+1][pos[r0]-1]]&&p[pos[l0]+1][pos[r0]-1]<x)x=p[pos[l0]+1][pos[r0]-1];
            fr(i,l0,r[pos[l0]])--cnt[a[i].rk];
            fr(i,l[pos[r0]],r0)--cnt[a[i].rk];
            printf("%d\n",rank[x]);
        }
    }
    return 0;
}

by yurzhang @ 2020-02-02 09:38:33

不会分块 /kk

神仙加油


|