http://www.lydsy.com/JudgeOnline/problem.php?id=2724

输入格式

第一行两个整数n,m,表示有n株蒲公英,m次询问。
接下来一行 n 个空格分隔的整数ai,表示蒲公英的种类
再接下来m行每行两个整数l0,r0,我们令上次询问的结果为x(如果这是第一次询问,则x=0)。
令l=(l0+x-1)mod n +1,r=(r0+x-1)mod n +1,如果l>r,则交换l,r。

最终的询问区间为[l,r]。

输出格式

输出m行。每行一个整数,表示每次询问的结果。

样例输入

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

样例输出

1
2
1

——————————————————————————————————

分块板子题。

我们首先离散化,然后分块分成sqrt(N)长度的块,然后预处理一下东西:

1.sum[i][j]:前j块i元素出现次数。

2.ans[i][j]:i~j块的众数。

这两个操作都靠暴力(桶排序)解决,复杂度显然O(NsqrtN)。

然后就是惊心动魄的询问时间:

1.跨度<=2个块长度:直接暴力。

2.跨度>2个块长度:显然区间一定跨过了至少一些/个连续的块,这些连续的块的众数我们能求出来,然后我们的答案显然就是:

  1.这个众数。

  2.非整块区间内的数。

对于2暴力(桶排序)即可,然后和1比较,注意处理2的个数的时候不要忘了加上该数在连续的块中出现的个数。

简单证明:我们只需要证明非连续的块的众数的数且没出现在非整块区间内的数一定不是众数。

这十分显然,因为它本身不是非连续的块的众数,个数一定比该众数小,又没出现在非整块区间内,所以个数一定比该众数小,则它一定不可能是众数。

#include<cstdio>
#include<queue>
#include<cctype>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
const int N=;
const int SQRTN=;
const int INF=;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
int n,m,lim,s,cnt,a[N],b[N],bl[SQRTN],br[SQRTN];
int sum[N][SQRTN],ans[N][SQRTN],t[N];
bool vis[N];
inline void LSH(){
sort(b+,b+lim+);
lim=unique(b+,b+lim+)-b-;
for(int i=;i<=n;i++){
a[i]=lower_bound(b+,b+lim+,a[i])-b;
}
return;
}
inline void intoblock(){
for(int i=;i<=n;i++){
if(i%s==){br[cnt]=i-;bl[++cnt]=i;}
}
br[cnt]=n;bl[cnt+]=n+;
return;
}
inline void init(){
for(int i=;i<=cnt;i++){
for(int j=bl[i];j<=n;j++)t[a[j]]=;
int maxn=-INF,cur;
for(int j=i;j<=cnt;j++){
for(int k=bl[j];k<=br[j];k++){
int c=++t[a[k]];
if(c>maxn)maxn=c,cur=a[k];
else if(c==maxn&&a[k]<cur)cur=a[k];
}
ans[i][j]=cur;
}
for(int j=;j<=lim;j++)sum[j][i]=sum[j][i-];
for(int j=bl[i];j<=br[i];j++){
sum[a[j]][i]++;
}
}
return;
}
inline int query(int l,int r){
memset(vis,,sizeof(vis));
memset(t,,sizeof(t));
int maxn=-INF,cur;
if(r-l+<=*s){
for(int i=l;i<=r;i++){
vis[a[i]]=;
t[a[i]]++;
}
for(int i=l;i<=r;i++){
if(vis[a[i]]){
if(t[a[i]]>maxn)maxn=t[a[i]],cur=a[i];
else if(t[a[i]]==maxn&&a[i]<cur)cur=a[i];
}
}
return cur;
}
int L=(l-)/s+,R=(r-)/s+;
cur=ans[L+][R-];
maxn=sum[cur][R-]-sum[cur][L];
for(int i=l;i<=br[L];i++){
vis[a[i]]=;
t[a[i]]++;
}
for(int i=bl[R];i<=r;i++){
vis[a[i]]=;
t[a[i]]++;
}
for(int i=l;i<=br[L];i++){
if(vis[a[i]]){
int c=t[a[i]]+sum[a[i]][R-]-sum[a[i]][L];
if(c>maxn)maxn=c,cur=a[i];
else if(c==maxn&&a[i]<cur)cur=a[i];
}
}
for(int i=bl[R];i<=r;i++){
if(vis[a[i]]){
int c=t[a[i]]+sum[a[i]][R-]-sum[a[i]][L];
if(c>maxn)maxn=c,cur=a[i];
else if(c==maxn&&a[i]<cur)cur=a[i];
}
}
return cur;
}
int main(){
n=read();m=read();s=sqrt(n);
for(int i=;i<=n;i++)a[i]=b[++lim]=read();
LSH();
intoblock();
init();
int pre=;
for(int i=;i<=m;i++){
int l=(read()+pre-)%n+,r=(read()+pre-)%n+;
if(l>r)swap(l,r);
printf("%d\n",pre=b[query(l,r)]);
}
return ;
}

BZOJ2724:[Violet 6]蒲公英——题解的更多相关文章

  1. [BZOJ2724][Violet 6]蒲公英

    [BZOJ2724][Violet 6]蒲公英 试题描述 输入 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n + 1 输出 输入示 ...

  2. BZOJ2724 [Violet 6]蒲公英 分块

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2724.html 题目传送门 - BZOJ2724 题意 求区间最小众数,强制在线. $n$ 个数,$m ...

  3. bzoj2724: [Violet 6]蒲公英(离散化+分块)

    我好弱啊..这题调了2天QwQ 题目大意:给定一个长度为n(n<=40000)的序列,m(m<=50000)次询问l~r之间出现次数最多的数.(区间众数) 这题如果用主席树就可以不用处理一 ...

  4. bzoj2724: [Violet 6]蒲公英 分块 区间众数 论algorithm与vector的正确打开方式

    这个,要处理各个数的话得先离散,我用的桶. 我们先把每个块里的和每个块区间的众数找出来,那么在查询的时候,可能成为[l,r]区间的众数的数只有中间区间的众数和两边的数. 证明:若不是这里的数连区间的众 ...

  5. 【分块】bzoj2724 [Violet 6]蒲公英

    分块,离散化,预处理出: ①前i块中x出现的次数(差分): ②第i块到第j块中的众数是谁,出现了多少次. 询问的时候,对于整块的部分直接获得答案:对于零散的部分,暴力统计每个数出现的次数,加上差分的结 ...

  6. bzoj2724: [Violet 6]蒲公英(分块)

    传送门 md调了一个晚上最后发现竟然是空间开小了……明明算出来够的…… 讲真其实我以前不太瞧得起分块,觉得这种基于暴力的数据结构一点美感都没有.然而今天做了这道分块的题才发现分块的暴力之美(如果我空间 ...

  7. 【BZOJ2724】[Violet 6]蒲公英 分块+二分

    [BZOJ2724][Violet 6]蒲公英 Description Input 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n ...

  8. BZOJ 2724: [Violet 6]蒲公英

    2724: [Violet 6]蒲公英 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 1633  Solved: 563[Submit][Status ...

  9. BZOJ 2724: [Violet 6]蒲公英( 分块 )

    虽然AC了但是时间惨不忍睹...不科学....怎么会那么慢呢... 无修改的区间众数..分块, 预处理出Mode[i][j]表示第i块到第j块的众数, sum[i][j]表示前i块j出现次数(前缀和, ...

随机推荐

  1. 【CentOS】下安装RabbitMQ教程

    系统版本: 安装依赖: 由于RabbitMQ依赖Erlang, 所以需要先安装Erlang. Erlang的安装方式大概有两种: (1) Erlang Solution安装(推荐) wget http ...

  2. CentOS 7.2-编译安装zabbix 3.4

    起因: 前面已经使用yum安装了zabbix 3.4了,准备去交差了,交差时老大明确要求必须使用编译安装,统一放在/usr/local目录下.... 重来吧!! 一.环境说明 本次安装使用CentOS ...

  3. python 终级篇 django ---ORM操作

                                       一般操作                                                          必会的 ...

  4. 254. Drop Eggs【LintCode java】

    Description There is a building of n floors. If an egg drops from the k th floor or above, it will b ...

  5. block inline 和 inline-block

    概念 block和inline这两个概念是简略的说法,完整确切的说应该是 block-level elements (块级元素) 和 inline elements (内联元素). block元素通常 ...

  6. Python对文本文件逐行扫描,将含有关键字的行存放到另一文件

    #逐行统计关键字行数,并将关键字所在行存放在新的文件中 keyword = "INFO" b = open("C:\\Users\\xxx\\Documents\\new ...

  7. WCF:REST + Basic authentification + IIS

    近期一个项目中用到Restful WCF提供服务,但是需要验证机制,网上搜刮了一些,都是太复杂.FQ找到了一篇不错的文章分享一下. 原地址连接:http://vgolovchenko.wordpres ...

  8. 6.hdfs的存储过程

    1.hdfs 怎么存储 切割存储 2. 为何每块是128m 与io读写速度有关,一般人的接受速度1s中,而磁盘的读写速度为100m/s,在读取文件时候需要硬盘寻找地址,一般读懂速度和寻找之间的比例是1 ...

  9. js经典试题之数据类型

    js经典试题之数据类型 1:输出"B" + "a" + + "B" + "a"的值: 答案:BaNaNa. 分析:因为+ ...

  10. Samba共享权限分配

    案例推荐:http://www.cnblogs.com/mchina/archive/2012/12/18/2816717.html 本文不详细介绍全部参数,只介绍完成需求的一些参数. 需求: 1,账 ...