【BZOJ2724】[Violet 6]蒲公英

Description

Input

修正一下

l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n + 1

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

题解:分块还是练脑子啊~

结论:一个区间的众数要么是区间中一个块的众数,要么是块外的任意一个数。

这就告诉我们需要预处理出任意两个块之间的所有数的众数,这个可以用离散化+桶+扫一遍实现。

那么对于询问[l,r]我们假设其中最大的连续的块是[ll,rr],那么我们已知了[ll,rr]中的众数,如何判断[l,ll),(rr,r]中的数是不是众数呢?

既然已经将所有数离散化了,我们就可以考虑记录每个数出现的位置。我们将每个数出现的位置从左到右用vector存起来,然后查询的时候二分一下,就知道了这个数在[l,r]中出现了多少次,用它来更新答案就行了。

sqrt(n/logn)大法好~

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn=40010;
int n,m,nm,B,mx,ans;
int v[maxn],st[maxn],ref[maxn];
int s[810][810];
vector<int> pos[maxn];
struct node
{
int org,val;
}num[maxn];
bool cmp(node a,node b)
{
return a.val<b.val;
}
int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
void query(int a,int b,int x)
{
if(!x||st[x]) return ;
int l=0,r=pos[x].size()-1,mid,c,d;
while(l<r)
{
mid=l+r>>1;
if(pos[x][mid]>=a) r=mid;
else l=mid+1;
}
c=r;
l=0,r=pos[x].size();
while(l<r)
{
mid=l+r>>1;
if(pos[x][mid]<=b) l=mid+1;
else r=mid;
}
d=l-1,st[x]=d-c+1;
if(st[x]>st[mx]||(st[x]==st[mx]&&x<mx)) mx=x;
}
int main()
{
//freopen("bz2724.in","r",stdin);
n=rd(),m=rd();
int i,j,a,b,c,d;
for(i=0;i<n;i++) num[i].val=rd(),num[i].org=i;
sort(num,num+n,cmp);
for(i=0;i<n;i++)
{
if(!i||num[i].val>num[i-1].val) ref[++nm]=num[i].val;
v[num[i].org]=nm;
}
B=int(sqrt(double(n)/log(n)));
for(i=0;i<n;i++) pos[v[i]].push_back(i);
for(i=0;i*B<n;i++)
{
memset(st,0,sizeof(st));
for(mx=0,j=i*B;j<n;j++)
{
st[v[j]]++;
if(st[v[j]]>st[mx]||(st[v[j]]==st[mx]&&v[j]<mx)) mx=v[j];
s[i][j/B]=mx;
}
}
memset(st,0,sizeof(st));
for(i=1;i<=m;i++)
{
a=(rd()+ans-1+n)%n,b=(rd()+ans-1+n)%n;
if(a>b) swap(a,b);
c=a/B,d=b/B;
if(c==d)
{
for(mx=0,j=a;j<=b;j++)
{
st[v[j]]++;
if(st[v[j]]>st[mx]||(st[v[j]]==st[mx]&&v[j]<mx)) mx=v[j];
}
ans=ref[mx],printf("%d\n",ans);
for(j=a;j<=b;j++) st[v[j]]--;
continue;
}
mx=0,query(a,b,s[c+1][d-1]);
for(j=a;j<c*B+B;j++) query(a,b,v[j]);
for(j=d*B;j<=b;j++) query(a,b,v[j]);
ans=ref[mx],printf("%d\n",ans);
st[s[c+1][d-1]]=0;
for(j=a;j<c*B+B;j++) st[v[j]]=0;
for(j=d*B;j<=b;j++) st[v[j]]=0;
}
return 0;
}

【BZOJ2724】[Violet 6]蒲公英 分块+二分的更多相关文章

  1. BZOJ2724 [Violet 6]蒲公英 分块

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2724.html 题目传送门 - BZOJ2724 题意 求区间最小众数,强制在线. $n$ 个数,$m ...

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

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

  3. [BZOJ2724][Violet 6]蒲公英

    [BZOJ2724][Violet 6]蒲公英 试题描述 输入 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n + 1 输出 输入示 ...

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

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

  5. bzoj2724: [Violet 6]蒲公英(分块)

    传送门 md调了一个晚上最后发现竟然是空间开小了……明明算出来够的…… 讲真其实我以前不太瞧得起分块,觉得这种基于暴力的数据结构一点美感都没有.然而今天做了这道分块的题才发现分块的暴力之美(如果我空间 ...

  6. 【bzoj2724】[Violet 6]蒲公英 分块+STL-vector

    题目描述 输入 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n + 1 输出 样例输入 6 3 1 2 3 2 1 2 1 5 3 ...

  7. 【分块】bzoj2724 [Violet 6]蒲公英

    分块,离散化,预处理出: ①前i块中x出现的次数(差分): ②第i块到第j块中的众数是谁,出现了多少次. 询问的时候,对于整块的部分直接获得答案:对于零散的部分,暴力统计每个数出现的次数,加上差分的结 ...

  8. bzoj2724: [Violet 6]蒲公英(离散化+分块)

    我好弱啊..这题调了2天QwQ 题目大意:给定一个长度为n(n<=40000)的序列,m(m<=50000)次询问l~r之间出现次数最多的数.(区间众数) 这题如果用主席树就可以不用处理一 ...

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

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

随机推荐

  1. #define,#undef宏学习

    1.预处理器 1.1预处理符号: __FILE__ :进行编译的源文件名字 __LINE__ :文件当前行的行号 __DATA__ :文件被编译的日期 __TIME__ :文件被编译的时间 __STD ...

  2. crossapp的屏幕适配

    1.分辨率是的某个尺寸大小的屏幕里的像素点数ppi 2.crossapp茶用iphone4为基准比例值为1 3.其它分辨率设备的换算dp = px * 320/ 屏幕PPI 4.crossapp里点. ...

  3. 前端JS利用canvas的drawImage()对图片进行压缩

    对于大尺寸图片的上传,在前端进行压缩除了省流量外,最大的意义是极大的提高了用户体验. 这种体验包括两方面: 1.由于上传图片尺寸比较小,因此上传速度会比较快,交互会更加流畅,同时大大降低了网络异常导致 ...

  4. 常见java异常

    1. java.lang.NullPointerException(空指针异常)  调用了未经初始化的对象或者是不存在的对象 经常出现在创建图片,调用数组这些操作中,比如图片未经初始化,或者图片创建时 ...

  5. 2016.6.20 tomcat端口始终被占用

    我在使用tomcat7时,服务开启时,始终提示端口被占用. 但是从进程中又看不到开启的tomcat. 最后在资源监视器中,结束重复开启的tomcat. (注意是资源监视器,刚开始的时候看成管理器,怎么 ...

  6. IDEA如何打包可运行jar的一个问题

    转载:http://bglmmz.iteye.com/blog/2058785 背景: 有时候,我们会用IDEA来开发一些小工具,需要打成可运行的JAR包:或者某些项目不是WEB应用,纯粹是后台应用, ...

  7. XJTU Summer Holiday Test 1(Brackets in Implications-构造)

    B - Brackets in Implications Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & ...

  8. IO流(一)File类

    1.File类:表示文件和目录路径的抽象的表示形式,可以实现文件的创建,删除,重命名等,是唯一与文件本 有关的操作类. 2.File类的API定义:public class File extends ...

  9. flask和pymongo的完美搭配

    1.如何进行mongo数据库的链接 import pymongo client = pymongo.MongoClient(host='192.168.*.*', port=27017,) db_au ...

  10. 偶遇 smon 进程cpu 开销高异常分析

    今天突然发现线上一台oracle 数据库 servercpu 跑的非常高.感觉不是非常正常,细致看了下.发现是smon 进程吃掉了一个cpu. 那么这个smon 进程究竟在倒腾啥玩意 对smon 进程 ...