ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CH4401 蒲公英

2019-03-27 12:53:44  阅读:287  来源: 互联网

标签:ch int tot read num rg 蒲公英 CH4401


题意

描述

题目PDF

样例输入

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

样例输出

1
2
1

来源

石家庄二中Violet 6杯省选模拟赛

分析

分块。
分成长度为T的tot块。因为众数只可能是整块里的众数或者是在整块外面又出现的数,所以可以预处理出任意连续的几块中每个数出现的的次数【需要离散化】和众数,再对询问区间中不在整块里的暴力统计,总复杂度O(n * tot^2+m * T),其中tot * T=n。取tot=n^(1/3),T=n^(2/3)。
时间复杂度O(n^(5/3)),空间复杂度O(n^(5/3))。

代码

#include<bits/stdc++.h>
#define rg register
#define il inline
#define co const
template<class T>il T read(){
    rg T data=0,w=1;rg char ch=getchar();
    while(!isdigit(ch)) {if(ch=='-') w=-1;ch=getchar();}
    while(isdigit(ch)) data=data*10+ch-'0',ch=getchar();
    return data*w;
}
template<class T>il T read(rg T&x) {return x=read<T>();}
typedef long long ll;
using namespace std;

co int N=4e4+6,T=37;
int a[N],b[N],L[N],R[N],pos[N],c[T][T][N],f[T][T][2],now[2];
void work(int x,int y,int num){
    ++c[x][y][num];
    if(c[x][y][num]>now[0]||c[x][y][num]==now[0]&&num<now[1])
        now[0]=c[x][y][num],now[1]=num;
}
int ask(int l,int r){
    int p=pos[l],q=pos[r];
    int x=0,y=0;
    if(p+1<=q-1) x=p+1,y=q-1;
    copy(f[x][y],f[x][y]+2,now);
    if(p==q){
        for(int i=l;i<=r;++i) work(x,y,a[i]);
        for(int i=l;i<=r;++i) --c[x][y][a[i]];
    }
    else{
        for(int i=l;i<=R[p];++i) work(x,y,a[i]);
        for(int i=L[q];i<=r;++i) work(x,y,a[i]);
        for(int i=l;i<=R[p];++i) --c[x][y][a[i]];
        for(int i=L[q];i<=r;++i) --c[x][y][a[i]];
    }
    return b[now[1]];
}
int main(){
//  freopen(".in","r",stdin),freopen(".out","w",stdout);
    int n=read<int>(),m=read<int>();
    for(int i=1;i<=n;++i) b[i]=read(a[i]);
    sort(b+1,b+n+1);
    int tot=unique(b+1,b+n+1)-(b+1);
    for(int i=1;i<=n;++i) a[i]=lower_bound(b+1,b+tot+1,a[i])-b;
    int t=pow(n,1.0/3);
    int len=t?n/t:n;
    for(int i=1;i<=t;++i) L[i]=(i-1)*len+1,R[i]=i*len;
    if(R[t]<n) L[t+1]=R[t]+1,R[++t]=n;
    for(int i=1;i<=t;++i)for(int j=L[i];j<=R[i];++j) pos[j]=i;
    for(int i=1;i<=t;++i)for(int j=1;j<=t;++j){
        for(int k=L[i];k<=R[j];++k) ++c[i][j][a[k]];
        for(int k=1;k<=tot;++k) if(c[i][j][k]>f[i][j][0])
            f[i][j][0]=c[i][j][k],f[i][j][1]=k;
    }
    for(int x=0,l,r;m--;){
        l=(read<int>()+x-1)%n+1,r=(read<int>()+x-1)%n+1;
        if(l>r) swap(l,r);
        printf("%d\n",x=ask(l,r));
    }
    return 0;
}

标签:ch,int,tot,read,num,rg,蒲公英,CH4401
来源: https://www.cnblogs.com/autoint/p/10606701.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有