zoukankan      html  css  js  c++  java
  • p4168 [Violet]蒲公英(分块)

    区间众数的重题
    和数列分块入门9双倍经验还是挺好的
    然后开O2水过
    好像有不带log的写法啊
    之后在补就是咕咕咕

    // luogu-judger-enable-o2
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <vector>
    #include <map>
    #include <cmath>
    using namespace std;
    int m,belong[100100],f[1000][1000],sz,blocknum,n,val[100100],id=0,cnt[100100],a[100100],ans=0;
    vector<int> Vec[100100];
    map<int,int> To;
    void calbe(int n){
        for(int i=1;i<=n;i++)
            belong[i]=(i-1)/sz+1;
    }
    void pre(int x){
        memset(cnt,0,sizeof(cnt));
        int ans=0,ansto=0;
        for(int i=(x-1)*sz+1;i<=n;i++){
            cnt[a[i]]++;
            if(cnt[a[i]]>ansto||(val[a[i]]<=val[ans]&&cnt[a[i]]>=ansto))
                ans=a[i],ansto=cnt[a[i]];
            f[x][belong[i]]=ans;
        }
    }
    int query(int l,int r,int c){
        return upper_bound(Vec[c].begin(),Vec[c].end(),r)-lower_bound(Vec[c].begin(),Vec[c].end(),l);
    }
    int query(int l,int r){
        int lsx=belong[l];
        int rex=belong[r];
        int ans=0,ansto=0,mid;
        for(int i=l;i<=min(lsx*sz,r);i++)
            if((mid=query(l,r,a[i]))>ansto||(val[a[i]]<=val[ans]&&mid>=ansto))
                ans=a[i],ansto=mid;
        if(lsx!=rex){
            for(int i=(rex-1)*sz+1;i<=r;i++)
                if((mid=query(l,r,a[i]))>ansto||(val[a[i]]<=val[ans]&&mid>=ansto))
                    ans=a[i],ansto=mid;
            if(lsx+1<=rex-1)
                if((mid=query(l,r,f[lsx+1][rex-1]))>ansto||(val[f[lsx+1][rex-1]]<=val[ans]&&mid>=ansto))
                    ans=f[lsx+1][rex-1],ansto=mid;
        }
        return ans;
    }
    int main(){
        // freopen("1.in","r",stdin);
        // freopen("test.out","w",stdout);
        scanf("%d %d",&n,&m);
        sz=150;
        blocknum=n/sz;
        if(n%sz)    
            blocknum++;
        calbe(n);
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            if(!To[a[i]]){
                To[a[i]]=++id;
                val[id]=a[i];
            }
            a[i]=To[a[i]];
            Vec[a[i]].push_back(i);
        }
        for(int i=1;i<=blocknum;i++)
            pre(i);
        for(int i=1;i<=m;i++){
            int l,r;
            scanf("%d %d",&l,&r);
            l=(l+ans-1)%n+1;
            r=(r+ans-1)%n+1;
            if(r<l)
                swap(l,r);
            printf("%d
    ",ans=val[query(l,r)]);
        }
        return 0;    
    }
    
  • 相关阅读:
    Java中==和equals的区别
    (转)JAVA-反射机制的使用
    JAVA三框架工作原理是什么?
    Spring的IoC模式
    JavaEE中为什么出现中文乱码?
    Android--Apache HttpClient(2种实现)
    Android之网络----使用HttpClient发送HTTP请求(通过get方法获取数据)
    Android—Http连接之GET/POST请求
    2014 12 04
    struts2的HelloWorld的基本过程
  • 原文地址:https://www.cnblogs.com/dreagonm/p/10048778.html
Copyright © 2011-2022 走看看