蒲公英(bzoj2724)(分块+区间众数)
Input
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$
题意:
求区间众数
题解:
见代码
//解决本题的重要性质:
//对于两个区间a,b,其中已知a区间的众数k
//则众数一定为k或是b区间的任意一个数
#include<bits/stdc++.h>
#define re register int
using namespace std;
const int N=40010,M=410;
int n,q,m,blen,bsum;
int a[N],b[N];//b为离散数组
int bl[M][M];//bl[i][j]表示第i个块中的第j个数,bl[i][0]表示第i个块的长度
int bk[N];//bk[i]表示第i个数(在原数列中)在第bk[i]个块中
int f[M][M];//f[i][j]表示第i块到第j块之间的众数
int g[N][M];//g[i][j]表示i在前j个块中出现的次数
void init(){//初始化
for(int i=1,j=1;i<=n;++j){
int k;
for(k=1;k<=blen&&i<=n;++i,++k){
bk[i]=j;
bl[j][k]=a[i];
}k--;
bl[j][0]=k;
bsum=j;
}//处理块
for(int i=1;i<=bsum;++i){
for(int j=1;j<=m;++j){
g[j][i]=g[j][i-1];
}
for(int j=1;j<=bl[i][0];++j){
g[bl[i][j]][i]++;
}
}//预处理g数组
for(int i=1;i<=bsum;++i){
for(int j=i;j<=bsum;++j){
int num=f[i][j-1];int mx=g[num][j]-g[num][i-1];
for(int k=1;k<=bl[j][0];++k){
int now=g[bl[j][k]][j]-g[bl[j][k]][i-1];
if(now>mx||(now==mx&&bl[j][k]<num))num=bl[j][k],mx=now;
}
f[i][j]=f[j][i]=num;
}
}//预处理f数组
}
void read(){//读入
cin>>n>>q;blen=sqrt(n);
for(int i=1;i<=n;++i)scanf("%d",a+i),b[i]=a[i];
}
void lsh(){
sort(b+1,b+n+1);
m=unique(b+1,b+n+1)-b-1;
for(int i=1;i<=n;++i)a[i]=lower_bound(b+1,b+m+1,a[i])-b;
}
void work(){
int last=0;
while(q--){
int l,r;
scanf("%d%d",&l,&r);
l=(l+last-1)%n+1;
r=(r+last-1)%n+1;
if(l>r)swap(l,r);
static int bj[M],cnt,v[N];cnt=0;//bj记录边角的数据,cnt为边角数据的数量
int L,R,num,mx;
if(bk[l]==bk[r]){//在同一块内暴力求众数
for(int i=l;i<=r;++i)bj[++cnt]=a[i],v[a[i]]++;
mx=0;
for(int i=l;i<=r;++i){
if(v[a[i]]>mx||(v[a[i]]==mx&&a[i]<num))num=a[i],mx=v[a[i]];
}
printf("%d\n",last=b[num]);
}else{//在不同块时,将中间当成一大块和边角比较
//根据性质,众数只有可能是中间这一块的众数或是边角上的数
//所以暴力枚举再判断就行了
re i;
for(i=l;bk[i]==bk[i-1];++i){
bj[++cnt]=a[i];v[a[i]]++;
}L=bk[i];
for(i=r;bk[i]==bk[i+1];--i){
bj[++cnt]=a[i];v[a[i]]++;
}R=bk[i];
num=f[L][R],mx=v[num]+g[num][R]-g[num][L-1];
for(i=1;i<=cnt;++i){
int now=v[bj[i]]+g[bj[i]][R]-g[bj[i]][L-1];
if(now>mx||(now==mx&&bj[i]<num))num=bj[i],mx=now;
}
printf("%d\n",last=b[num]);
}
for(re i=1;i<=cnt;++i)--v[bj[i]];//v数组要这样清空,复杂度O(cnt),不能用memset,那样是O(n)
}
}
int main(){
read();
lsh();
init();
work();
}
蒲公英(bzoj2724)(分块+区间众数)的更多相关文章
- bzoj2724: [Violet 6]蒲公英 分块 区间众数 论algorithm与vector的正确打开方式
这个,要处理各个数的话得先离散,我用的桶. 我们先把每个块里的和每个块区间的众数找出来,那么在查询的时候,可能成为[l,r]区间的众数的数只有中间区间的众数和两边的数. 证明:若不是这里的数连区间的众 ...
- 【BZOJ2724】蒲公英 题解(分块+区间众数)
题目链接 题目大意:给定一段长度为$n$的序列和$m$次询问,每次询问区间$[l,r]$内的最小的众数.$n\leq 40000,a_i\leq 10^9$ --------------------- ...
- BZOJ 2724: [Violet 6]蒲公英 [分块 区间众数]
传送门 题面太美不忍不放 分块分块 这种题的一个特点是只有查询,通常需要预处理:加入修改的话需要暴力重构预处理 预处理$f[i][j]$为第i块到第j块的众数,显然$f[i][j]=max{f[i][ ...
- LOJ6285 数列分块入门9(分块 区间众数)题解
题意:给出区间内的最小众数 思路:分块,离散化每个数,开vector记录每个数p出现的位置,这样就能二分出L,R以内p的个数了.众数有一个性质,用mode(a)表示集合a的众数,那么mode(a∪b) ...
- 洛谷P4168 蒲公英 分块处理区间众数模板
题面. 许久以前我还不怎么去机房的时候,一位大佬好像一直在做这道题,他称这道题目为"大分块". 其实这道题目的思想不只可以用于处理区间众数,还可以处理很多区间数值相关问题. 让我们 ...
- 【BZOJ2724】蒲公英(分块)
[BZOJ2724]蒲公英(分块) 题面 洛谷 谴责权限题的行为 题解 分块什么的都不会,根本就没写过几次. 复杂度根本不会分析,吓得我赶快来练练. 这题要求的是区间众数,显然没有什么很好的主席树之类 ...
- BZOJ2724 [Violet]蒲公英(分块)
区间众数.分块,预处理任意两块间所有数的众数,和每块中所有数的出现次数的前缀和.查询时对不是整块的部分暴力,显然只有这里出现的数可能更新答案.于是可以优美地做到O(n√n). #include< ...
- 【BZOJ 2724】 2724: [Violet 6]蒲公英 (区间众数不带修改版本)
2724: [Violet 6]蒲公英 Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 1908 Solved: 678 Description In ...
- luogu4168蒲公英(区间众数)
luogu4168蒲公英(区间众数) 给定n个数,m个区间询问,问每个询问中的众数是什么. 题面很漂亮,大家可以去看一下. 对于区间众数,由于区间的答案不能由子区间简单的找出来,所以似乎不能用树形结构 ...
随机推荐
- Spring框架的事务管理相关的类和API
1. PlatformTransactionManager接口 -- 平台事务管理器.(真正管理事务的类).该接口有具体的实现类,根据不同的持久层框架,需要选择不同的实现类! 2. Transacti ...
- Spring框架的核心功能之AOP概述
1. 什么是AOP的技术? * 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程 * AOP是一种编程范式,隶属于软工范畴,指导开发者如何组织程序结构 ...
- oracle pl sql import export
http://blog.163.com/magicc_love/blog/static/185853662201281013345829/
- Golang之Mysql事务
Mysql事务 )原子性 )一致性 )隔离性 )持久性 示例代码 package main import ( "fmt" _ "github.com/go-sql-dri ...
- Django之Form功能
一 什么是Form?什么是DjangoForm? Django表单系统中,所有的表单类都作为django.forms.Form的子类创建,包括ModelForm 关于django的表单系统,主要分两种 ...
- 学习类App原型制作分享-Wokabulary
Wokabulary是一款多功能词汇学习App,可以学习多国语言词汇.原型的引导页面采用的图片+文字+分页器,需要注意的是分页器选中位置要与页面顺序一致.其次是语言的选择页面,在前面给大家介绍过滚动区 ...
- DataStage 八、清除日志
DataStage序列文章 DataStage 一.安装 DataStage 二.InfoSphere Information Server进程的启动和停止 DataStage 三.配置ODBC Da ...
- 内网IP和公网IP的区别
内网IP和公网IP的区别 什么是内网IP: 一些小型企业或者学校,通常都是申请一个固定的IP地址,然后通过IP共享(IP Sharing),使用整个公司或学校的机器都能够访问互联网.而 ...
- Windows游戏找不到了怎么办?
大家有的时候,可能是不慎操作,或是某些新装的Windows,会发现那些经典的游戏不见了,那它们去哪了呢?是长腿跑了?还是Windows偷工减料?都不是,让巩固来教你们把他们找出来! 1.在开 ...
- 100 floors 2 eggs
https://github.com/Premiumlab/Python-for-Algorithms--Data-Structures--and-Interviews/blob/master/Moc ...