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

①前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. java的多构造函数的处理方式

    /** * */ package P; import java.awt.List; import java.lang.reflect.Array; import java.util.ArrayList ...

  2. Jquery 获取checkbox的checked问题以及解决方案

    转载自:http://www.cnblogs.com/-run/archive/2011/11/16/2251250.html 这个郁闷了,今天写这个功能的时候发现了问题,上网找了好多资料对照,更加纠 ...

  3. Spring学习-- IOC 容器中 bean 的生命周期

    Spring IOC 容器可以管理 bean 的生命周期 , Spring 允许在 bean 声明周期的特定点执行定制的任务. Spring IOC 容器对 bean 的生命周期进行管理的过程: 通过 ...

  4. C#三层中的分页

    最近写了一个winform的管理系统,里面的分页同学推荐了几种,感觉都不好用,比较麻烦,自己就找了一个比较简单的分页,利用数据存储过程来分页. reate proc usp_User@pageInde ...

  5. mysql 基本操作练习

    ), sex ), age )); , '北京'); , '上海'); , '广州'); , '北京'); , '北京'); , '上海'); , '北京'); #(). 写出sql语句,查询所有年龄 ...

  6. 知问前端——日历UI(一)

    日历(datepicker)UI,可以让用户更加直观的.更加方便的输入日期,并且还考虑不同国家的语言限制,包括汉语. 调用datepicker()方法 $('#date').datepicker(); ...

  7. 【poj3415-长度不小于k的公共子串个数】后缀数组+单调栈

    这题曾经用sam打过,现在学sa再来做一遍. 基本思路:计算A所有的后缀和B所有后缀之间的最长公共前缀. 分组之后,假设现在是做B的后缀.前面的串能和当前的B后缀产生的公共前缀必定是从前往后单调递增的 ...

  8. bzoj4900 [CTSC2017]密钥

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4900 [题解] 恭喜bzoj达到40页 考场由于傻逼基数排序写挂了而gg. 竟然忘了考试前一 ...

  9. TensorFlow_曲线拟合

    # coding:utf-8 import tensorflow as tf import numpy as np import matplotlib.pyplot as plt import os ...

  10. 渗透测试中如何科学地使用V*P*N

    环境说明 Windows7 虚拟机,作为VPN网关,负责拨VPN.VPN可以直接OPENVPN,也可以使用ShadowSocks+SSTap. Kali 虚拟机, 渗透测试工作机 配置步骤 Windo ...