分块,离散化,预处理出:

①前i块中x出现的次数(差分);

②第i块到第j块中的众数是谁,出现了多少次。

询问的时候,对于整块的部分直接获得答案;对于零散的部分,暴力统计每个数出现的次数,加上差分的结果,尝试更新ans。

 #include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m,sum,sz,num[],l[],r[],plv[][],mode[][],mplv[][];
int a[],en,Time[],x,y,ma[],ans;
struct Point{int v,p;}b[];
bool operator < (const Point &a,const Point &b){return a.v<b.v;}
int Res,Num;char C,CH[];
inline int G()
{
Res=;C='*';
while(C<''||C>'')C=getchar();
while(C>=''&&C<=''){Res=Res*+(C-'');C=getchar();}
return Res;
}
inline void P(int x)
{
Num=;if(!x){putchar('');puts("");return;}
while(x>)CH[++Num]=x%,x/=;
while(Num)putchar(CH[Num--]+);
puts("");
}
void makeblock()
{
sz=(int)sqrt((double)n); if(!sz) sz=;
for(sum=;sum*sz<n;sum++)
{
l[sum]=r[sum-]+;
r[sum]=sum*sz;
for(int i=l[sum];i<=r[sum];i++) num[i]=sum;
}
l[sum]=r[sum-]+;
r[sum]=n;
for(int i=l[sum];i<=r[sum];i++) num[i]=sum;
}
void LiSan()
{
sort(b+,b+n+);
for(int i=;i<=n;i++)
{
if(b[i].v!=b[i-].v) en++;
ma[a[b[i].p]=en]=b[i].v;
}
}
void makeplv()
{
for(int i=;i<=n;i++)
for(int j=num[i];j<=sum;j++)
plv[a[i]][j]++;
}
void makemode()
{
for(int i=;i<=sum;i++)
{
memset(Time,,sizeof(Time));
int modenow,modeplv=;
for(int j=i;j<=sum;j++)
{
for(int k=l[j];k<=r[j];k++)
{
Time[a[k]]++;
if(Time[a[k]]>modeplv||(Time[a[k]]==modeplv&&a[k]<modenow))
{
modenow=a[k];
modeplv=Time[a[k]];
}
}
mode[i][j]=modenow;
mplv[i][j]=modeplv;
}
} memset(Time,,sizeof(Time));
}
int Getplv(const int &v,const int &L,const int &R){return plv[v][R]-plv[v][L-];}
int main()
{
n=G(); m=G();
for(int i=;i<=n;i++) {b[i].v=G(); b[i].p=i;}
makeblock(); LiSan(); makeplv(); makemode();
for(int i=;i<=m;i++)
{
x=G(); y=G(); x=(x+ans-)%n+; y=(y+ans-)%n+;
if(x>y) swap(x,y);
int modenow,modeplv=;
if(num[x]+>=num[y])
{
for(int j=x;j<=y;j++)
{
Time[a[j]]++;
if(Time[a[j]]>modeplv||(Time[a[j]]==modeplv&&a[j]<modenow))
{
modenow=a[j];
modeplv=Time[a[j]];
}
}
for(int j=x;j<=y;j++) Time[a[j]]--;
}
else
{
modenow=mode[num[x]+][num[y]-];
modeplv=mplv[num[x]+][num[y]-];
for(int j=x;j<=r[num[x]];j++)
{
Time[a[j]]++; int t=Time[a[j]]+Getplv(a[j],num[x]+,num[y]-);
if(t>modeplv||(t==modeplv&&a[j]<modenow))
{
modenow=a[j];
modeplv=t;
}
}
for(int j=l[num[y]];j<=y;j++)
{
Time[a[j]]++; int t=Time[a[j]]+Getplv(a[j],num[x]+,num[y]-);
if(t>modeplv||(t==modeplv&&a[j]<modenow))
{
modenow=a[j];
modeplv=t;
}
}
for(int j=x;j<=r[num[x]];j++) Time[a[j]]--;
for(int j=l[num[y]];j<=y;j++) Time[a[j]]--;
}
P(ans=ma[modenow]);
}
return ;
}

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

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

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

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

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

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

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

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

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

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

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

  6. 【BZOJ2724】[Violet 6]蒲公英 分块+二分

    [BZOJ2724][Violet 6]蒲公英 Description Input 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n ...

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

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

  8. BZOJ_2724_[Violet 6]蒲公英_分块

    BZOJ_2724_[Violet 6]蒲公英_分块 Description Input 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod ...

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

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

随机推荐

  1. Codeforces Round #328 (Div. 2) A

    A. PawnChess time limit per test 1 second memory limit per test 256 megabytes input standard input o ...

  2. 【BZOJ】1571: [Usaco2009 Open]滑雪课Ski

    [算法]动态规划 [题解]yy出了O(1w log 1w)的算法. 将雪坡排序预处理出g[i]表示能力值为i的最短时长雪坡. 这样就可以定义work(t,c)表示时长t能力c的最多滑雪数量,work( ...

  3. swift出师作,史丹佛大学游戏制作案例,计算器,小游戏

    这两个案例得好好弄清楚,感觉在任何方面既然能够作为公开课被提到这所名校的课程里面自然有不得不学习的理由,感觉应该去入手一下,毕竟这种课,价格不匪,难以接触,能看到就当再教育了.

  4. 【洛谷 P1667】 数列 (贪心)

    题目链接 对于一个区间\([x,y]\),设这个区间的总和为\(S\) 那么我们在前缀和(设为\(sum[i]\))的意义上考虑到原操作其实就是\(sum[x−1]+=S\) , \(sum[x]+S ...

  5. Oracle 脚本记录

    给表创建序列或触发器 create or replace procedure p_createseq(tablename in varchar2,key in varchar2) Authid Cur ...

  6. Python学习笔记 - day6 - 函数

    函数 函数在编程语言中就是完成特定功能的一个词句组(代码块),这组语句可以作为一个单位使用,并且给它取一个名字.可以通过函数名在程序的不同地方多次执行(这叫函数的调用).函数在编程语言中有基本分为:预 ...

  7. mysql 四 表操作

    表介绍 表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称为表的字段 id,name,qq,age称为字段,其余的,一行内容称为一条记录 本节重点: 1 创建 ...

  8. camera驱动框架分析(下)

    sensor的驱动 v4l2_i2c_new_subdev_board先用client = i2c_new_device(adapter, info);创建info对应的i2c_client对象(代表 ...

  9. Makefile 變數替換

    Makefile SUBDIRS = xxx aaa BUILDSUBDIRS = $(SUBDIRS:%=build-%) CLEANSUBDIRS = $(SUBDIRS:%=clean-%) . ...

  10. [ 总结 ] Linux 下文件描述符

    1.概述: 文件描述符是内核为了高效管理已被打开的文件所创建的索引.是一个非负整数,用于代指被打开的文件.所有通过I/O操作的系统调用都通过文件描述符. 文件描述符用以表明每一个被进程所打开的文件和s ...