题目大意:

给你一个长为n的序列a,m次询问,每次查询一个区间的众数的出现次数,强制在线。

解题思路:

出题人题解

众所周知lxl是个毒瘤,Ynoi道道都是神仙题

首先得离散化。

分块后,预处理Fi,j表示第i∼j块的众数的出现次数。此处要用一个桶,空间复杂度O(n),时间复杂度O(n√n)。

用vector按顺序存每个数值所有元素的出现位置。

再记录每个元素在相应vector里的下标p。

以上空间复杂度都是O(n)的。

考虑询问,中间的直接使用预处理出的Fi,j的值即可。设当前的答案ans=Fi,j。

考虑边界的元素。

显然,由于边界的数最多2√n个,所以最多使得答案增加2√n。

我们只需要检查这些边角的元素,每次判断这些数的出现次数能否达到ans+1。

对于左边的边角元素x,我们在相应的vector里找到下标为px+ans的元素yy,若y⩽ry⩽r,则说明该数值在范围内有至少ans+1ans+1个数,暴力++ans即可。

对于右边的边角元素x,我们在相应的vector里找到下标为px−ans的元素yy,若y⩾ly⩾l,则说明该数值在范围内有至少ans+1ans+1个数,暴力++ans即可。

每次询问对O(√n)个元素检查,++ans的次数为O(√n)次。所以查询的时间复杂度为O(m√n)。

总时间复杂度O((n+m)√n),空间复杂度O(n),lxl说达到了下界。

C++ Code:

#include<cstdio>
#include<cctype>
#include<vector>
#include<cstring>
#include<algorithm>
#define siz 708
#define N 500001
class istream{
char buf[],*s;
public:
inline istream(){
#ifndef ONLINE_JUDGE
freopen("input.txt","r",stdin);
#endif
fread(s=buf,,,stdin);
fclose(stdin);
}
inline istream&operator>>(int&rhs){
int f=rhs=;
for(;!isdigit(*s);++s)f=*s=='-';
for(;isdigit(*s);)
rhs=(rhs<<)+(rhs<<)+(*s++^'');
if(f)rhs=-rhs;
return*this;
}
}cin;
class ostream{
char buf[],*s;
public:
inline ostream(){s=buf;}
inline ostream&operator<<(int rhs){
if(rhs<)*s++='-',rhs=-rhs;
if(rhs==){
*s++='';
return*this;
}
static int w;
for(w=;w<=rhs;w*=);
for(w/=;w;w/=)*s++=(rhs/w)^'',rhs%=w;
return*this;
}
inline ostream&operator<<(const char&rhs){*s++=rhs;return*this;}
inline~ostream(){
fwrite(buf,,s-buf,stdout);
}
}cout;
int n,m,L[],R[],bel[N],blocks,mx[][],ans,tot[N],wz[N],a[N];
void init(){
blocks=(n-)/siz+;
for(int i=;i<=blocks;++i)L[i]=R[i-]+,R[i]=i*siz;
R[blocks]=n;
for(int i=;i<=blocks;++i){
memset(tot,,sizeof tot);
for(int j=L[i];j<=R[i];++j)bel[j]=i;
for(int j=i;j<=blocks;++j){
int&F=mx[i][j];
F=mx[i][j-];
for(int k=L[j];k<=R[j];++k)
F=std::max(F,++tot[a[k]]);
}
}
}
std::vector<int>ls,v[N];
int main(){
ls.push_back(-);
cin>>n>>m;
for(int i=;i<=n;ls.push_back(a[i++]))cin>>a[i];
std::sort(ls.begin(),ls.end());
ls.erase(std::unique(ls.begin(),ls.end()),ls.end());
for(int i=;i<=n;++i)v[a[i]=std::lower_bound(ls.begin(),ls.end(),a[i])-ls.begin()].push_back(i),wz[i]=v[a[i]].size()-;
init();
memset(tot,,sizeof tot);
while(m--){
int l,r;cin>>l>>r;
l^=ans,r^=ans;
ans=;
if(bel[l]==bel[r]){
for(int i=l;i<=r;++i)ans=std::max(ans,++tot[a[i]]);
for(int i=l;i<=r;++i)tot[a[i]]=;
}else{
ans=mx[bel[l]+][bel[r]-];
for(int i=l;i<=R[bel[l]];++i){
int it=wz[i];
while(it+ans<v[a[i]].size()&&v[a[i]][it+ans]<=r)++ans;
}
for(int i=L[bel[r]];i<=r;++i){
int it=wz[i];
while(it-ans>=&&v[a[i]][it-ans]>=l)++ans;
}
}
cout<<ans<<'\n';
}
return ;
}

[Ynoi2019模拟赛]Yuno loves sqrt technology III的更多相关文章

  1. [Luogu5048] [Ynoi2019模拟赛]Yuno loves sqrt technology III[分块]

    题意 长为 \(n\) 的序列,询问区间众数,强制在线. \(n\leq 5\times 10^5\). 分析 考虑分块,暴力统计出整块到整块之间的众数次数. 然后答案还可能出现在两边的两个独立的块中 ...

  2. [luogu5048] [Ynoi2019模拟赛] Yuno loves sqrt technology III

    题目链接 洛谷. Solution 思路同[BZOJ2724] [Violet 6]蒲公英,只不过由于lxl过于毒瘤,我们有一些更巧妙的操作. 首先还是预处理\(f[l][r]\)表示\(l\sim ...

  3. [洛谷P5048][Ynoi2019模拟赛]Yuno loves sqrt technology III

    题目大意:有$n(n\leqslant5\times10^5)$个数,$m(m\leqslant5\times10^5)$个询问,每个询问问区间$[l,r]$中众数的出现次数 题解:分块,设块大小为$ ...

  4. 洛谷P5048 [Ynoi2019模拟赛]Yuno loves sqrt technology III(分块)

    传送门 众所周知lxl是个毒瘤,Ynoi道道都是神仙题 用蒲公英那个分块的方法做结果两天没卡过去→_→ 首先我们分块,预处理块与块之间的答案,然后每次询问的时候拆成整块和两边剩下的元素 整块的答案很简 ...

  5. Luogu P5048 [Ynoi2019模拟赛]Yuno loves sqrt technology III 分块

    这才是真正的$N\sqrt{N}$吧$qwq$ 记录每个数$vl$出现的位置$s[vl]$,和每个数$a[i]=vl$是第几个$vl$,记为$P[i]$,然后预处理出块$[i,j]$区间的答案$f[i ...

  6. P5048 [[Ynoi2019模拟赛]Yuno loves sqrt technology III]

    为什么我感觉这题难度虚高啊-- 区间众数的出现次数- 计算器算一下 \(\sqrt 500000 = 708\) 然后我们发现这题的突破口? 考虑分块出来[L,R]块的众数出现个数 用 \(\text ...

  7. 洛谷 P5048 - [Ynoi2019 模拟赛] Yuno loves sqrt technology III(分块)

    题面传送门 qwq 感觉跟很多年前做过的一道题思路差不多罢,结果我竟然没想起那道题?!!所以说我 wtcl/wq 首先将 \(a_i\) 离散化. 如果允许离线那显然一遍莫队就能解决,复杂度 \(n\ ...

  8. [Ynoi2019模拟赛]Yuno loves sqrt technology II(二次离线莫队)

    二次离线莫队. 终于懂了 \(lxl\) 大爷发明的二次离线莫队,\(\%\%\%lxl\) 二次离线莫队,顾名思义就是将莫队离线两次.那怎么离线两次呢? 每当我们将 \([l,r]\) 移动右端点到 ...

  9. [Ynoi2019模拟赛]Yuno loves sqrt technology II

    题目大意: 给定一个长为\(n\)的序列,\(m\)次询问,每次查询一个区间的逆序对数. 32MB. 解题思路: 出题人题解 众所周知lxl是个毒瘤,Ynoi道道都是神仙题 二次离线莫队. 对于每个区 ...

随机推荐

  1. spring整合dubbo

    以前跨系统访问是直接http.webservice等,近期有能使用dubbo的应用场景,特来记一下 本次会使用zookeeper来当注册中心 首先引入dubbo的依赖 <dependency&g ...

  2. 自动调参库hyperopt+lightgbm 调参demo

    在此之前,调参要么网格调参,要么随机调参,要么肉眼调参.虽然调参到一定程度,进步有限,但仍然很耗精力. 自动调参库hyperopt可用tpe算法自动调参,实测强于随机调参. hyperopt 需要自己 ...

  3. asp调用短信接口实现用户注册

    前几天做一个asp语言开发的网站需要实现用户注册短信验证功能,就研究了一下如何实现,简单给大家分享下调用过程. 首先需要找到一个第三方短信接口,当时用的是动力思维乐信的短信接口. 首先需要先注册个动力 ...

  4. sticky

    最近有点忘了position几个取值的内容,在这里简单总结一下. position的含义是指定位类型,取值类型可以有:static.relative.absolute.fixed.inherit和st ...

  5. java完整并发知识结构图

    一张大的java并发知识结构图,梳理清楚知识的脉络,知识不再零散

  6. 19.Scharr滤波器

    //Scharr void Test_Scharr() { Mat grad_x,grad_y; Mat abs_grad_x,abs_grad_y,dst; g_srcImage=imread(&q ...

  7. Python机器学习(基础篇---监督学习(朴素贝叶斯))

    朴素贝叶斯 朴素贝叶斯分类器的构造基础是贝叶斯理论.采用概率模型来表述,定义x=<x1,x2,...,xn>为某一n维特征向量,y∈{c1,c2,...ck}为该特征向量x所有k种可能的类 ...

  8. oracle 优化方法总结

    分析和优化的基本步骤如下: 1.如果是SQL语句的写法问题,我们可以通过在不更改业务逻辑的情况下改写SQL来加以解决: 2.如果是不必要的全表扫描/排序而导致了目标SQL的性能问题,我们可以通过建立合 ...

  9. IP通信基础课堂笔记----关于数链层

    课前回顾 IOS从上到下分别有:应用层,传输层,网络层,数链层,物理层. IP是网络层的地址,MAC是数链层的地址,IP必须通过ARP才能转换成MAC地址. 课堂内容 1.如何在数链层实现发送端数据无 ...

  10. 石头的Xcode学习列表

    http://www.cnblogs.com/JangoJing/tag/xcode/