bzoj 2724[Violet 6]蒲公英

2724: [Violet 6]蒲公英

Time Limit: 40 Sec  Memory Limit: 512 MB
Submit: 2630  Solved: 920
[Submit][Status][Discuss]

Description

 

Input

修正一下

l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n + 1

Output

Sample Input

6 3
1 2 3 2 1 2
1 5
3 6
1 5

Sample Output

1
2
1

HINT

 


修正下:


n <= 40000, m <= 50000

//区间众数  比较经典的做法  据说可以离散莫队做 但是一直没想出怎么转移 参考了黄学长的博客 知道了可以预处理一些东西 强行将复杂度降为n*sqrt(n) 只要
//预处理出i-j块的区间众数和数量 然后暴力查询该区间边缘最多2*sqrt(n)个数 判断是否对块区间众数是否产生影响 进而得出答案....重点别忘记初始化 
/**************************************************************
    Problem: 2724
    User: c20161007
    Language: C++
    Result: Accepted
    Time:3180 ms
    Memory:34644 kb
****************************************************************/
 
#include <bits/stdc++.h>
#define ll long long
#define N 40005 
using namespace std;
ll readll(){
    ll 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*10+ch-'0';ch=getchar();}
    return x*f;
}
int readint(){
    int x=0,f=1;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
    while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
    return f*x;
}
int p[N],a[N],size,n,m;
vector<int>vec;
int kind[205][205];
int num[205][205];
int sum[205][N];
int jishu[N];
int ans;int ans1;
void advance(int t){
    for(int i=1;i<=p[n];i++){
        for(int j=1;j<=t;j++) sum[i][j]=sum[i-1][j];
        for(int j=(i-1)*size+1;j<=min(n,size*i);j++) sum[i][a[j]]++;
    }
//  for(int i=1;i<=p[n];i++){
//      for(int j=(i-1)*size+1;j<=min(n,size*i);j++){
//          cout<<a[j]<<" ";
//      }
//      cout<<endl;
//      for(int j=1;j<=t;j++){
//          cout<<i<<" "<<sum[i][j]<<endl;
//      }
//  }
    for(int i=1;i<=p[n];i++){
        num[i][i]=-1;
        for(int j=(i-1)*size+1;j<=min(n,i*size);j++){
            int tp=sum[i][a[j]]-sum[i-1][a[j]];
            if(tp>=num[i][i]){
                if(tp==num[i][i]) kind[i][i]=min(kind[i][i],a[j]);
                else kind[i][i]=a[j];
                num[i][i]=tp;
            }
        }
        for(int j=i+1;j<=p[n];j++){
            num[i][j]=num[i][j-1];kind[i][j]=kind[i][j-1];
            for(int k=(j-1)*size+1;k<=min(n,size*j);k++){
                int tp=sum[j][a[k]]-sum[i-1][a[k]];
                if(tp>=num[i][j]){
                    if(tp==num[i][j]) kind[i][j]=min(kind[i][j],a[k]);
                    else kind[i][j]=a[k];
                    num[i][j]=tp;
                }
            }
        }
    }
}
void update(int l,int r){
        for(int i=l;i<=size*p[l];i++){
        jishu[a[i]]++;
        if(jishu[a[i]]>=ans){
            if(jishu[a[i]]==ans) ans1=min(ans1,a[i]);
            else ans1=a[i];
            ans=jishu[a[i]];
        }           
            }
        for(int i=(p[r]-1)*size+1;i<=r;i++){
            jishu[a[i]]++;
            if(jishu[a[i]]>=ans){
                if(jishu[a[i]]==ans) ans1=min(ans1,a[i]);
                else ans1=a[i];
                ans=jishu[a[i]];
            }           
        }
        for(int i=l;i<=size*p[l];i++) jishu[a[i]]=0;
        for(int i=(p[r]-1)*size+1;i<=r;i++) jishu[a[i]]=0;
}
int slove(int l,int r){
    ans=-1;
    if(p[l]==p[r]){
        for(int i=l;i<=r;i++){
            jishu[a[i]]++;
            if(jishu[a[i]]>=ans){
                if(jishu[a[i]]==ans) ans1=min(ans1,a[i]);
                else ans1=a[i];
                ans=jishu[a[i]];
            }
        }
        for(int i=l;i<=r;i++) jishu[a[i]]=0;
        return ans1;
    }
    if(p[r]-p[l]==1){
        update(l,r);
        return ans1;
    }
    ans=num[p[l]+1][p[r]-1];ans1=kind[p[l]+1][p[r]-1];
    for(int i=l;i<=size*p[l];i++) jishu[a[i]]=sum[p[r]-1][a[i]]-sum[p[l]][a[i]];
    for(int i=(p[r]-1)*size+1;i<=r;i++) jishu[a[i]]=sum[p[r]-1][a[i]]-sum[p[l]][a[i]];
    update(l,r);
    return ans1;
}
int main(){
    ios::sync_with_stdio(false);
    n=readint();m=readint();size=(int)sqrt(n);
    for(int i=1;i<=n;i++){
        a[i]=readint();p[i]=(i-1)/size+1;
        vec.push_back(a[i]);
    }
//  cout<<size<<endl;   
    sort(vec.begin(),vec.end());
    int t=unique(vec.begin(),vec.end())-vec.begin();
    for(int i=1;i<=n;i++) a[i]=lower_bound(vec.begin(),vec.begin()+t,a[i])-vec.begin()+1;
    advance(t);int Lans=0;int l,r;
    for(int i=1;i<=m;i++){
        l=readint();r=readint();
        l=(l+Lans-1)%n+1;r=(r+Lans-1)%n+1;
        if(l>r) swap(l,r);
        Lans=vec[slove(l,r)-1];
        printf("%d\n",Lans);
    }
    return 0;
}

  

posted @ 2018-02-13 19:09  wang9897  阅读(173)  评论(0编辑  收藏  举报