BZOJ2724:[Violet 6]蒲公英——题解
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]蒲公英——题解的更多相关文章
- [BZOJ2724][Violet 6]蒲公英
[BZOJ2724][Violet 6]蒲公英 试题描述 输入 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n + 1 输出 输入示 ...
- BZOJ2724 [Violet 6]蒲公英 分块
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2724.html 题目传送门 - BZOJ2724 题意 求区间最小众数,强制在线. $n$ 个数,$m ...
- bzoj2724: [Violet 6]蒲公英(离散化+分块)
我好弱啊..这题调了2天QwQ 题目大意:给定一个长度为n(n<=40000)的序列,m(m<=50000)次询问l~r之间出现次数最多的数.(区间众数) 这题如果用主席树就可以不用处理一 ...
- bzoj2724: [Violet 6]蒲公英 分块 区间众数 论algorithm与vector的正确打开方式
这个,要处理各个数的话得先离散,我用的桶. 我们先把每个块里的和每个块区间的众数找出来,那么在查询的时候,可能成为[l,r]区间的众数的数只有中间区间的众数和两边的数. 证明:若不是这里的数连区间的众 ...
- 【分块】bzoj2724 [Violet 6]蒲公英
分块,离散化,预处理出: ①前i块中x出现的次数(差分): ②第i块到第j块中的众数是谁,出现了多少次. 询问的时候,对于整块的部分直接获得答案:对于零散的部分,暴力统计每个数出现的次数,加上差分的结 ...
- bzoj2724: [Violet 6]蒲公英(分块)
传送门 md调了一个晚上最后发现竟然是空间开小了……明明算出来够的…… 讲真其实我以前不太瞧得起分块,觉得这种基于暴力的数据结构一点美感都没有.然而今天做了这道分块的题才发现分块的暴力之美(如果我空间 ...
- 【BZOJ2724】[Violet 6]蒲公英 分块+二分
[BZOJ2724][Violet 6]蒲公英 Description Input 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n ...
- BZOJ 2724: [Violet 6]蒲公英
2724: [Violet 6]蒲公英 Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 1633 Solved: 563[Submit][Status ...
- BZOJ 2724: [Violet 6]蒲公英( 分块 )
虽然AC了但是时间惨不忍睹...不科学....怎么会那么慢呢... 无修改的区间众数..分块, 预处理出Mode[i][j]表示第i块到第j块的众数, sum[i][j]表示前i块j出现次数(前缀和, ...
随机推荐
- sql中的几种连接类型
一.连接类型简介 在sql中单表查询的几率相对来说比较少,随着数据库的日益复杂,多表关联的情况越来越多,在多表关联的情况下存在多种关联的类型, 1.自关联(join或inner join) 2.左外关 ...
- 最新flowable研究学习及其汉化flowable6.3中文
flowable 是activiti的分支,现在感觉比activiti要强大一些,官网是 https://flowable.org/ 下载最新的6.31版本. 放到tomcat下面,汉化需要对flow ...
- Use GitHub Desktop to get GitHub projects
Find the project's https git file in the home page of the project. e.g. https://github.com/PrismLibr ...
- django1.11+xadmin的搭建
1.git clone https://github.com/sshwsfc/xadmin.git或者直接下载zip包 2..在项目根目录下建一个extra_apps的包,将xadmin源码包存放在里 ...
- python3基础盲点
数值类型 Python支持四种不同的数值类型,包括int(整数)long(长整数)float(浮点数)complex (复数) python3对整数的大小不做限制 算数运算符 优先级: 逻辑运算符 优 ...
- requests,lxml爬启信宝
首先, 添加requests模块: 然后, 添加lxml模块: 启信宝登录抓包: QiXinBao.py: import requestsfrom lxml import etree loginUrl ...
- DirectX11与DirectX12在古墓丽影暗影中的表现
最近在关注这两个图形API,因为感兴趣,也算是初学者. 以下内容仅供参考. 使用古墓丽影暗影游戏,分别对这两个进行比较,得出的结论如下图(此笔记本散热很差,更改散热应该比下图结果好些): 首先看可以很 ...
- Java应用基础微专业-工程篇
第1章-命令行 1.1 命令行基础 ls -a: list all files (including hidden files) .DS_Store: files detailed informati ...
- MD5接口解密操作_接口签名校验
很多HTTP接口在传参时,需要先对接口的参数进行数据签名加密如以下POST接口 http://localhost:8080/pinter/com/userInfo 参数为{"phoneNum ...
- ajax的$.get()方法和tomcat服务器的交互
AJAX AJAX = 异步 JavaScript 和 XML. AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. Ajax get()方法 定义和用法 $.get() 方法 ...