分块,预处理出每两个块范围内的众数,然后在暴力枚举块外的进行比较

那么怎么知道每一个数出现的次数呢?离散后,对于每一个数,维护一个动态数组就好了

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>
#include<map>
#define N 40005
using namespace std;
int a[N],be[N],n,m,nn,cnt,val[N],c[N],tot;
int num[N];
map<int,int> mm;
vector <int > q[N];
int f[205][205];
int getnum(int l,int r,int x){
return upper_bound(q[x].begin(),q[x].end(),r)-lower_bound(q[x].begin(),q[x].end(),l);
}
int query(int l,int r){
int maxn=0,now=0;
if(be[l]==be[r]){
for(int i=l;i<=r;i++){
int t=getnum(l,r,c[i]);
if(t>maxn||(t==maxn&&a[i]<a[now])){
maxn=t; now=i;
}
}
return a[now];
}
now=f[be[l]+1][be[r]-1]; maxn=getnum(l,r,c[now]);
for(int i=l;i<=be[l]*nn;i++){
int t=getnum(l,r,c[i]);
if(t>maxn||(t==maxn&&a[i]<a[now])){
maxn=t; now=i;}
}
for(int i=(be[r]-1)*nn+1;i<=r;i++){
int t=getnum(l,r,c[i]);
if(t>maxn||(t==maxn&&a[i]<a[now])){
maxn=t; now=i;}
}
return a[now];
}
int main()
{
scanf("%d%d",&n,&m);
nn=(int)sqrt(n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
if(!mm.count(a[i])) mm[a[i]]=++cnt;
be[i]=(i-1)/nn+1;
c[i]=mm[a[i]];
q[c[i]].push_back(i);
}
tot=be[n]; int maxn,now;
for(int i=1;i<=tot;i++){
memset(num,0,sizeof(num)); maxn=0; now=0;
for(int j=(i-1)*nn+1;j<=n;j++){
num[c[j]]++;
if(num[c[j]]>maxn||(num[c[j]]==maxn&&a[j]<a[now])){
now=j; maxn=num[c[j]];
}
f[i][be[j]]=now;
}
}
int ans=0,l,r;
while(m--){
scanf("%d%d",&l,&r);
l=(l+ans-1+n)%n+1;
r=(r+ans-1+n)%n+1;
if(l>r) swap(l,r);
ans=query(l,r);
printf("%d\n",ans);
}
return 0;
}

bzoj 2724 蒲公英 分块的更多相关文章

  1. BZOJ 2724 蒲公英 | 分块模板题

    题意 给出一个序列,在线询问区间众数.如果众数有多个,输出最小的那个. 题解 这是一道分块模板题. 一个询问的区间的众数,可能是中间"整块"区间的众数,也可能是左右两侧零散的数中的 ...

  2. BZOJ 2724蒲公英 (分块) 【内有块大小证明】

    题面 luogu传送门 分析 先分块,设块大小为x(之后我们会证明块大小取何值会更优) 步骤1 把所有的数离散化,然后对每个值开一个vector pos[i],pos[i]存储数i出现的位置 我们设查 ...

  3. [BZOJ 2724] [Violet 6] 蒲公英 【分块】

    题目链接:BZOJ - 2724 题目分析 这道题和 BZOJ-2821 作诗 那道题几乎是一样的,就是直接分块,每块大小 sqrt(n) ,然后将数字按照数值为第一关键字,位置为第二关键字排序,方便 ...

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

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

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

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

  6. BZOJ.2724.[Violet 6]蒲公英(静态分块)

    题目链接 区间众数 强制在线 考虑什么样的数会成为众数 如果一个区间S1的众数为x,那么S1与新区间S2的并的众数只会是x或S2中的数 所以我们可以分块先预处理f[i][j]表示第i到第j块的众数 对 ...

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

    题意 在线区间众数 思路 预处理出 f[i][j] 即从第 i 块到第 j 块的答案.对于每个询问,中间的整块直接用预处理出的,两端的 sqrtn 级别的数暴力做,用二分查找它们出现的次数.每次询问的 ...

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

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

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

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

随机推荐

  1. 教你一步步发布一个开源库到 JCenter

    今天想来分享下,如何一步步自己发布一个开源库到 JCenter 这方面的博客网上已经特别多了,所以本篇并不打算仅仅只是记录流程步骤而已,而是尽可能讲清楚,为什么需要有这个步骤,让大伙知其然的同时还知其 ...

  2. JBOSS的启动和停止

    本实例使用的JBOSS版本是jboss-4.2.3.GA 假设条件 1.  已设置好JAVA_HOME环境变量 2.  已下载JBoss并且安装目录为:D:\Java\jboss-4.2.3.GA 启 ...

  3. Flask框架之 --- 我的第一个个人网站(雏形)

    现在还是个静态网站 , 而且这里的Flask也只是起到了提供虚拟web服务器的作用  , 下一步是实现数据库的连接 , 实现简单的动态访问.

  4. 网易面经(Java开发岗)

    网易面经(Java岗) 网易两面面经整理 岗位:我投递的是杭研所的Java开发岗位.行程:半天的时间南京=杭州之间穿行,单程2个小时,从杭州东站=网易大厦,单程1个小时(如果能买到城站高铁动车票可以从 ...

  5. ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?

    官方已经给出解决方案:https://github.com/pyenv/pyenv/wiki/Common-build-problems#error-the-python-ssl-extension- ...

  6. 一步一步设置Joomla!开发环境

    转载自:http://h2appy.blog.51cto.com/609721/373414 虽然是英文,可是写的非常浅显易懂,再配合截图,更是明了. http://docs.joomla.org/S ...

  7. Install OpenCV on Ubuntu or Debian

    http://milq.github.io/install-OpenCV-ubuntu-debian/转注:就用第一个方法吧,第二个方法的那个sh文件执行失败,因为我价格kurento.org的源,在 ...

  8. ThinkPHP5从零基础搭建CMS系统(二)

    接上节,开启wamp集成环境,在浏览器地址栏输入http://localhost/cms/public,即可运行项目,但是这边域名太长,做一下处理. 注:需要查看tp5全部教程,请点击右侧thinkp ...

  9. 嵌入Python系列 | 调用Python模块中无参数函数

    开发环境 Python版本:3.6.4 (32-bit) 编辑器:Visual Studio Code C++环境:Visual Studio 2013 需求说明 在用VS2013编写的Win32程序 ...

  10. 1、原生javascript方法小汇

    Js 对象 使用new 关键字来创建对象,举例如下, var a = new String();如构造函数无参数,则不必加括号, JS内部对象数组(Array)对象创建数组var myarray = ...