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

①前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. 【转载】惊天大悲剧-Hadoop的rmr和trash

    转自:http://java-doom.iteye.com/blog/1898000 这两天在操作Hadoop集群时,由于一个误操作,制作了一个天大的悲剧 不小心把Hadoop集群上的所有文件全部删除 ...

  2. android View实现变暗效果

    android项目中做一个默认图片变暗,有焦点时变亮的效果.相信大家都能各种办法,各种手段很容易的实现这个效果.这里记录下作者实现这个效果的过程及遇到的问题,仅供参考.见下图(注:因为是eclipse ...

  3. 利用os、hash模块生成目录下所有文件的md5

    hashlib用于对字符串或者文件进行加密. 使用方法1: hashlib.md5('str').hexdigest() 使用MD5对str进行加密,使用hexdigest(),16进制的方式打印   ...

  4. Symfony2之创建一个简单的web应用 Symfony2——创建bundle

    bundle就像插件或者一个功能齐全的应用,我们在应用层上开发的应用的所有代码,包括:PHP文件.配置文件.图片.css文件.js文件等都会包含在bunde系统中.          可以通过两种方法 ...

  5. HDU1503(LCS,记录路径)

    Advanced Fruits Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  6. git error: unable to write file xxx,git fatal: unable to write new index file

    执行git checkout -- . error: unable to write file mobile/manifest.jsonfatal: unable to write new index ...

  7. python读取doc

    import os, time, fnmatch from docx import Document class search: def __init__(self, path, search_str ...

  8. 关于easyui checkbox 的一些操作处理

    1.easyui在每一行加checkbox { field: 'id', title: '编号', checkbox: true } 2.easyui分页时记住前面已选的checkbox 设置easy ...

  9. 算法题之Climbing Stairs(leetcode 70)

    题目: You are climbing a stair case. It takes n steps to reach to the top. Each time you can either cl ...

  10. js 各种取整方式及方法

    1.直接丢弃小数部分,保留整数部分 a:parseInt(1.5555) b: 0|1.5555 2.向上取整 a: Math.ceil(1.5555) b: (1.5555+0.5).toFixed ...