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

①前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. The XOR Largest Pair [Trie]

    描述 在给定的N个整数A1,A2--AN中选出两个进行xor运算,得到的结果最大是多少? 输入格式 第一行一个整数N,第二行N个整数A1-AN. 输出格式 一个整数表示答案. 样例输入 3 1 2 3 ...

  2. POJ2912:Rochambeau(带权并查集)

    Rochambeau Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5208   Accepted: 1778 题目链接:h ...

  3. border-image

    一.border-image的兼容性 border-image可以说是CSS3中的一员大将,将来一定会大放光彩,其应用潜力真的是非常的惊人.可惜目前支持的浏览器有限,仅 Firefox3.5,chro ...

  4. codeforces613B - Skills &&金中市队儿童节常数赛

    题目传送门 本随笔写的是第二题...... 这道题方法就是搞乱....因为n较mxa小 所以枚举达到最大上限的点 然后就乱搞 代码看看咯 #include<cstdio> #include ...

  5. CentOS 7 主机加固手册-下

      CentOS 7 主机加固手册-上 CentOS 7 主机加固手册-中 CentOS 7 主机加固手册-下 0x1f 删除禁用非必要的服务 删除非必要的服务 # Remove yum remove ...

  6. Python爬虫学习 - day2 - 站点登陆

    利用Python完成简单的站点登陆 最近学习到了爬虫,瞬时觉得很高大上,想取什么就取什么,感觉要上天.这里分享一个简单的登陆抽屉新热榜的教程(因为它不需要验证码,目前还没有学会图像识别.哈哈),供大家 ...

  7. python模块之os.path

    对文件路径的操作 os.path.split(p)函数返回一个路径的目录名和文件名. os.path.splitext():分离文件名与扩展名 os.path.isfile()和os.path.isd ...

  8. Grunt环境搭建及使用 前端必备

    jQuery在使用grunt,bootstrap在使用grunt,百度UEditor在使用grunt,你没有理由不学.不用! 1. 前言 各位web前端开发人员,如果你现在还不知道grunt或者听说过 ...

  9. c语言中Triplet是什么意思?

    此词条多出现于三元组抽象数据类型的定义. 例如: 数据结构编程试验中,构造三元组类型. 1.三元组抽象数据类型的定义 ADT Triplet { 数据对象:D={e1, e2, e3| e1, e2, ...

  10. BMP文件组成

    BMP文件组成 BMP文件由文件头.位图信息头.颜色信息和图形数据四部分组成. 如图: 位图文件头BITMAPFILEHEADER 位图信息头BITMAPINFOHEADER 调色板Palette 实 ...