zoukankan      html  css  js  c++  java
  • 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
    ",Lans);
        }
        return 0;
    }
    

      

  • 相关阅读:
    48-最长不含重复字符的子字符串
    51-数组中的逆序对
    字符串的排列
    二叉树转链表
    求根
    构造二叉树
    二叉树中序遍历
    反转链表系列
    斐波那契系列
    f.lux
  • 原文地址:https://www.cnblogs.com/wang9897/p/8447239.html
Copyright © 2011-2022 走看看