蒲公英(bzoj2724)(分块+区间众数)
.gif)
Input
.gif)
Output
.gif)
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框架编写XML的提示
1. 步骤一:先复制, http://www.springframework.org/schema/beans/spring-beans.xsd 2. 步骤二:搜索XML Catalog,点击Add按 ...
- LINQ to Entities 不支持 LINQ 表达式节点类型“ArrayIndex”。
错误原因: bool res1 = S_ROLE_MENU_PURVIEWCODE_Manage.Delete(c => c.MPC_CODE == strs[0]); linq不能写strs[ ...
- Luugu 3084 [USACO13OPEN]照片Photo
很神仙的dp...假装自己看懂了,以后回来复习复习... 设$f_{i}$表示从$1$到$i$,且$i$这个点必放的最大数量. 一个区间有两个限制条件:至少放一个,至多放一个. 因为一个区间至多要放一 ...
- 工作五年以上的 UI 设计师都在干什么?
30 岁,现在坐标北京,从毕业至今都一直在做设计.目前从业超过了五年,也没打算离开设计这个行业.即便有一天不再从事设计专职的岗位,也仍然会在生活中,或者一些份外的工作中做「设计师」的角色,因为设计已成 ...
- springmvc 返回汉字乱码
1.删除配置文件中的<mvc:annotation-driven /> 2.添加如下配置 <bean class="org.springframework.web.ser ...
- DB2分页查询SQL
select * from (select row_number() over() as rown,tpag.* from(SELECT int(COALESCE(列名1,0)),COALESCE(列 ...
- 2018.09.27 codeforces1045D. Interstellar battle(期望dp)
传送门 一道有意思的期望dp. 题意是给出一棵树,每个点最开始都有一个gg的概率,有m次修改,每次修改会把某个点gg的概率更换掉,让你求出每次修改之后整个树被分成的连通块的数量的期望(gg掉的点不算) ...
- java 解析txt/html文件
package util.read; import java.io.BufferedReader;import java.io.FileReader; public class ReadFromFil ...
- IntelliJ IDEA 2017版 编译器使用学习笔记(二) (图文详尽版);IDE快捷键使用
补充介绍IntellJ 介绍主菜单功能及相关用途: File -------------> 对文件进行操作 Edit ------------> 对文本进行操作 View -------- ...
- java @option之args4j
args4j简介 args4j是一个用来配置命令行的工具. 在实际的项目中用到命令行的并不是很常见,但当真正使用到时,特别是在程序启动时配置一下参数的时候就很有用了,如果参数很多的话,一个一个解析命令 ...