蒟蒻求助~

P4168 [Violet] 蒲公英

Matsusaki @ 2018-09-25 20:06:54

第2、3、4个点过不去,求dalao帮忙查错.

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=100005;
int n,Q,ans,Max,num,TT;
int a[maxn],id[maxn],tot[1005][maxn],sum[1005][maxn],pos[maxn];
int cnt[maxn],md[1005][1005],c[maxn];
bool cmp(int x,int y){return a[x]<a[y];}
bool cmp2(int x,int y){return id[x]<id[y];}
inline int read()
{
    int ret=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9') {if(ch=='-') f=-f;ch=getchar();}
    while(ch>=48&&ch<=57) {ret=ret*10+ch-48;ch=getchar();}
    return ret*f;
}
int get(int x,int l,int r){return cnt[x]+sum[pos[r]-1][x]-sum[pos[l]][x];}
int main()
{
    n=read(),Q=read();TT=sqrt(n);
    for(int i=1;i<=n;i++) a[i]=read(),id[i]=i,pos[i]=(i-1)/TT+1;
    sort(id+1,id+1+n,cmp);
    for(int i=1;i<=n;i++)
    {
        int j=i;
        while(a[id[j+1]]==a[id[i]]&&j<n) j++;
        c[++num]=a[id[i]];
        for(int k=i;k<=j;k++) a[id[k]]=num;
        i=j;
    }
    for(int i=1;i<=n;i++) tot[pos[i]][a[i]]++;
    for(int i=1;i<=TT;i++) for(int j=1;j<=num;j++) sum[i][j]=sum[i-1][j]+tot[i][j];
    for(int i=1;i<=pos[n];i++)
    {
        for(int j=(i-1)*TT+1;j<=n;j++)
        {
            if(pos[j]!=pos[j-1]) md[i][pos[j]]=md[i][pos[j-1]];
            int &x=md[i][pos[j]];
            if(++cnt[a[j]]>cnt[x]||(cnt[a[j]]==cnt[x]&&a[j]<x)) x=a[j];
        }
        for(int j=(i-1)*TT+1;j<=n;j++) --cnt[a[j]];
    }
    while(Q--)
    {
        int l=(read()+c[ans]-1)%n+1,r=(read()+c[ans]-1)%n+1;
        if(l>r) swap(l,r);
        ans=0;
        if(pos[r]-pos[l]<=2)
        {
            for(int j=l;j<=r;j++) if(++cnt[a[j]]>cnt[ans]||(cnt[a[j]]==cnt[ans]&&a[j]<ans)) ans=a[j];
            for(int j=l;j<=r;j++) --cnt[a[j]];
        }
        else
        {
            ans=md[pos[l]+1][pos[r]-1];
            for(int j=l;pos[j]==pos[l];j++)
            {
                ++cnt[a[j]];
                if(get(a[j],l,r)>get(ans,l,r)||(get(a[j],l,r)==get(ans,l,r)&&a[j]<ans)) ans=a[j];
            }
            for(int j=r;pos[j]==pos[r];j--)
            {
                ++cnt[a[j]];
                if(get(a[j],l,r)>get(ans,l,r)||(get(a[j],l,r)==get(ans,l,r)&&a[j]<ans)) ans=a[j];
            }
            for(int j=l;pos[j]==pos[l];j++) --cnt[a[j]];
            for(int j=r;pos[j]==pos[r];j--) --cnt[a[j]];
        }
        printf("%d\n",c[ans]);
    }
    return 0;
}

代码风格勿喷


by 吹雪吹雪吹 @ 2018-09-25 20:08:51

我不会啊QAQ

大佬您肯定会的~ @memset0


by memset0 @ 2018-09-25 20:27:28

@假装老船长 喵... memset0 很菜的说....


by 吹雪吹雪吹 @ 2018-09-25 20:31:28

@memset0 您又fAKe喵,您一定会的poi,


|