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)(分块+区间众数)的更多相关文章

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

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

  2. 【BZOJ2724】蒲公英 题解(分块+区间众数)

    题目链接 题目大意:给定一段长度为$n$的序列和$m$次询问,每次询问区间$[l,r]$内的最小的众数.$n\leq 40000,a_i\leq 10^9$ --------------------- ...

  3. BZOJ 2724: [Violet 6]蒲公英 [分块 区间众数]

    传送门 题面太美不忍不放 分块分块 这种题的一个特点是只有查询,通常需要预处理:加入修改的话需要暴力重构预处理 预处理$f[i][j]$为第i块到第j块的众数,显然$f[i][j]=max{f[i][ ...

  4. LOJ6285 数列分块入门9(分块 区间众数)题解

    题意:给出区间内的最小众数 思路:分块,离散化每个数,开vector记录每个数p出现的位置,这样就能二分出L,R以内p的个数了.众数有一个性质,用mode(a)表示集合a的众数,那么mode(a∪b) ...

  5. 洛谷P4168 蒲公英 分块处理区间众数模板

    题面. 许久以前我还不怎么去机房的时候,一位大佬好像一直在做这道题,他称这道题目为"大分块". 其实这道题目的思想不只可以用于处理区间众数,还可以处理很多区间数值相关问题. 让我们 ...

  6. 【BZOJ2724】蒲公英(分块)

    [BZOJ2724]蒲公英(分块) 题面 洛谷 谴责权限题的行为 题解 分块什么的都不会,根本就没写过几次. 复杂度根本不会分析,吓得我赶快来练练. 这题要求的是区间众数,显然没有什么很好的主席树之类 ...

  7. BZOJ2724 [Violet]蒲公英(分块)

    区间众数.分块,预处理任意两块间所有数的众数,和每块中所有数的出现次数的前缀和.查询时对不是整块的部分暴力,显然只有这里出现的数可能更新答案.于是可以优美地做到O(n√n). #include< ...

  8. 【BZOJ 2724】 2724: [Violet 6]蒲公英 (区间众数不带修改版本)

    2724: [Violet 6]蒲公英 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 1908  Solved: 678 Description In ...

  9. luogu4168蒲公英(区间众数)

    luogu4168蒲公英(区间众数) 给定n个数,m个区间询问,问每个询问中的众数是什么. 题面很漂亮,大家可以去看一下. 对于区间众数,由于区间的答案不能由子区间简单的找出来,所以似乎不能用树形结构 ...

随机推荐

  1. sublime Text与python3的中文编码错误解决办法

    在 linux服务器上运行代码报错: Python3中遇到UnicodeEncodeError: ‘ascii’ codec can’t encode characters in ordinal no ...

  2. datagrid分页 从后端获取数据也很简单

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Datagrid.aspx. ...

  3. sql删除重复记录

    DELETE E FROM t E where E.id> ( SELECT MIN(X.id) FROM t X WHERE X.name = E.name );

  4. part1:1-embeded学习心态

    遇到问题,要冷静分析问题,采用排除法,个个排除查找问题之所在!切记!在没分析完自己问题之前,别把问题所在指向他人!

  5. 向一个文件流写入一个数据块---fwrite

    函数原型:int fwrite(const void *buffer,size_t size,size_t count,FILE *stream); 参数说明:buffer:用于写入到文件的数据地址. ...

  6. 20155317 王新玮 2016-2017-2 《Java程序设计》第9周学习总结

    20155317 王新玮 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以 ...

  7. Reverse string using recursion

    On-Site Question 3 - SOLUTION Question Given a string, write a function that uses recursion to rever ...

  8. Jigloo 下载 安装 GUI

    这个需要授权,一直不能解决!! 网上找了很多,都觉不能访问,这个可以用Eclipse直接更新的 http://www.cloudgardensoftware.com/jigloo/update-sit ...

  9. 2018.10.15 NOIP训练 水流成河(换根dp)

    传送门 换根dp入门题. 貌似李煜东的书上讲过? 不记得了. 先推出以1为根时的答案. 然后考虑向儿子转移. 我们记f[p]f[p]f[p]表示原树中以ppp为根的子树的答案. g[p]g[p]g[p ...

  10. 2018.09.11 bzoj47214721: [Noip2016]蚯蚓(单调队列)

    传送门 好题. 目测只会多带一个log2(n+m)" role="presentation" style="position: relative;"& ...