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

Solution

考虑分块,存两个东西,一个是两个块之间包含的区间的答案,另一个块的每个蒲公英的出现次数的前缀和

之前还要离散化

询问的时候就只要走边角料就可以了,访问一种蒲公英的出现次数用前缀和作差就好了

#include<bits/stdc++.h>
#define ui unsigned int
#define ll long long
#define db double
#define ld long double
#define ull unsigned long long
#define REP(a,b,c) for(register int a=(b),a##end=(c);a<=a##end;++a)
#define DEP(a,b,c) for(register int a=(b),a##end=(c);a>=a##end;--a)
const int MAXN=40000+10,MAXM=200+10;
int n,m,a[MAXN],sum[MAXM][MAXN],id[MAXM][MAXM],P[MAXN],vis[MAXN],st[MAXM],ed[MAXM],cnt,lastans,unit,bel[MAXN];
std::vector<int> V;
std::map<int,int> M;
template<typename T> inline void read(T &x)
{
T data=0,w=1;
char ch=0;
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
x=data*w;
}
template<typename T> inline void write(T x,char ch='\0')
{
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
if(ch!='\0')putchar(ch);
}
template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
template<typename T> inline T min(T x,T y){return x<y?x:y;}
template<typename T> inline T max(T x,T y){return x>y?x:y;}
inline void discretization()
{
REP(i,1,n)V.push_back(a[i]);
std::sort(V.begin(),V.end());
V.erase(std::unique(V.begin(),V.end()),V.end());
REP(i,0,V.size()-1)M[V[i]]=i+1,P[i+1]=V[i];
REP(i,1,n)a[i]=M[a[i]];
}
inline void init()
{
unit=std::sqrt(n);
REP(i,1,n)bel[i]=(i-1)/unit+1;
for(register int i=1;i<=n;i+=unit)st[++cnt]=i,ed[cnt]=min(i+unit-1,n);
REP(i,1,cnt)
{
REP(j,1,n)sum[i][j]=sum[i-1][j];
REP(j,st[i],ed[i])sum[i][a[j]]++;
}
REP(i,1,cnt)
{
int app=0,res=0;
REP(j,i,cnt)
{
REP(k,st[j],ed[j])
{
vis[a[k]]++;
if(vis[a[k]]==app)chkmin(res,a[k]);
else if(vis[a[k]]>app)app=vis[a[k]],res=a[k];
}
id[i][j]=res;
}
REP(j,st[i],n)vis[a[j]]--;
}
}
inline int solve(int l,int r)
{
int app=0,res=0;
if(bel[r]-bel[l]<=1)
{
REP(i,l,r)
{
vis[a[i]]++;
if(vis[a[i]]==app)chkmin(res,a[i]);
else if(vis[a[i]]>app)app=vis[a[i]],res=a[i];
}
REP(i,l,r)vis[a[i]]--;
return res;
}
res=id[bel[l]+1][bel[r]-1];
app=sum[bel[r]-1][res]-sum[bel[l]][res];
DEP(i,ed[bel[l]],l)
{
vis[a[i]]++;
int all=sum[bel[r]-1][a[i]]-sum[bel[l]][a[i]]+vis[a[i]];
if(all==app)chkmin(res,a[i]);
else if(all>app)app=all,res=a[i];
}
REP(i,st[bel[r]],r)
{
vis[a[i]]++;
int all=sum[bel[r]-1][a[i]]-sum[bel[l]][a[i]]+vis[a[i]];
if(all==app)chkmin(res,a[i]);
else if(all>app)app=all,res=a[i];
}
DEP(i,ed[bel[l]],l)vis[a[i]]--;
REP(i,st[bel[r]],r)vis[a[i]]--;
return res;
}
int main()
{
read(n);read(m);
REP(i,1,n)read(a[i]);
discretization();
init();
while(m--)
{
int x,y,l,r;read(x);read(y);
l=(x+lastans-1)%n+1,r=(y+lastans-1)%n+1;
if(l>r)std::swap(l,r);
write(lastans=P[solve(l,r)],'\n');
}
return 0;
}

【刷题】BZOJ 2724 [Violet 6]蒲公英的更多相关文章

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

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

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

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

  3. [BZOJ 2724] [Violet 6] 蒲公英 【分块】

    题目链接:BZOJ - 2724 题目分析 这道题和 BZOJ-2821 作诗 那道题几乎是一样的,就是直接分块,每块大小 sqrt(n) ,然后将数字按照数值为第一关键字,位置为第二关键字排序,方便 ...

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

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

  5. BZOJ.2724.[Violet 6]蒲公英(静态分块)

    题目链接 区间众数 强制在线 考虑什么样的数会成为众数 如果一个区间S1的众数为x,那么S1与新区间S2的并的众数只会是x或S2中的数 所以我们可以分块先预处理f[i][j]表示第i到第j块的众数 对 ...

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

    题意 在线区间众数 思路 预处理出 f[i][j] 即从第 i 块到第 j 块的答案.对于每个询问,中间的整块直接用预处理出的,两端的 sqrtn 级别的数暴力做,用二分查找它们出现的次数.每次询问的 ...

  7. 【BZOJ】2724: [Violet 6]蒲公英

    2724: [Violet 6]蒲公英 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 2900  Solved: 1031[Submit][Statu ...

  8. 【BZOJ 2724】 2724: [Violet 6]蒲公英 (区间众数不带修改版本)

    2724: [Violet 6]蒲公英 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 1908  Solved: 678 Description In ...

  9. USACO 刷题记录bzoj

    bzoj 1606: [Usaco2008 Dec]Hay For Sale 购买干草——背包 #include<cstdio> #include<cstring> #incl ...

随机推荐

  1. Codeforces round 1103

    Div1 534 我可能还太菜了.jpg 果然我只是Div 2 选手 A (这题是Div1吗... 直接构造:竖着放的在第一行和第二行,然后横着放的时候直接放在第三行就行. #include < ...

  2. Android开发——进程间通信之Bundle和文件

    0.  前言 不论是Android还是其他操作系统,都会有自己的IPC机制,所谓IPC(Inter-Process Communication)即进程间通信.首先线程和进程是很不同的概念,线程是CPU ...

  3. R语言学习 第二篇:矩阵和数组

    向量是一维的,只有行这一个维度,没有其他维度.R可以创建更高维度的数据对象,例如,矩阵.数据框.数组,索引高维度的对象时,需要使用元素的下标.这些对象的下标都使用中括号[]和索引,第一个维度是row, ...

  4. Spring学习(十九)----- Spring与WEB容器整合

    首先可以肯定的是,加载顺序与它们在 web.xml 文件中的先后顺序无关.即不会因为 filter 写在 listener 的前面而会先加载 filter.最终得出的结论是:listener -> ...

  5. 这可能是最详细的Python文件操作

    删除 # ==================删除==================# 只能删除文件,若为目录则报错# 若文件正在使用,Windows下会直接报错,Linux下会在目录表中删除记录, ...

  6. kafka的简单理解

    经典组合: Flume+Kafka+Storm+HDFS/HBase Flume:分布式采集 Kafka:分布式缓存 Kafka简介: 一种分布式的.基于发布/订阅的消息系统(Scala编写的) Ka ...

  7. cocos2dx渲染架构

    2dx的时代UI树便利和渲染是没有分开的,遍历UI树的时候就渲染.3dx版本为了分离了ui树的遍历和渲染,先遍历生成渲染命令发到渲染队列,之后遍历渲染命令队列开始渲染.这样做的好处是渲染命令可以重用, ...

  8. C++基础知识(2)

    作为接口的函数头 C++函数可被其他函数激活或调用,函数头描述了函数与调用它的函数之间的接口. 在C语言中,省略返回类型相当于说函数的类型为int,然而,C++逐步淘汰了这种用法 也可以使用下面的变体 ...

  9. Kubernetes采用CoreDNS

    参考文档: kubernetes插件:https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dns/coredns 自 ...

  10. Java并发编程(详解wait(), notify(),sleep())

    http://blog.csdn.net/luckyzhoustar/article/details/48179161