正题

题目链接:https://www.luogu.com.cn/problem/P5048


题目大意



就是这个

【QA】区间众数,但空间很小

长度为\(n\)的序列,要求支持查找区间众数出现次数。

强制在线

\(1\leq n,m\leq 5\times 10^5\)


解题思路

空间小就不能用蒲公英那种做法了

分块然后处理出每个连续块段的众数,就是设\(f_{l,r}\)表示从块\(l\sim r\)的区间众数出现次数。

然后考虑散块的部分,如果散块会更新答案那么显然新的众数一定是出现在散块里的,所以答案增加不会超过\(2\sqrt n\)

用\(vector\)记录每个数字出现的位置,然后对于散块的每个数字我们看一下\(ans\)能否增加(就是往下到第\(ans+1\)个数字是否还在范围内就好了)

时间复杂度\(O(n\sqrt n)\)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
const int N=5e5+10,M=710;
int n,m,cnt,pos[N],a[N],b[N],c[N],w[N],L[M],R[M],f[M][M];
vector<int>v[N];
int Ask(int l,int r){
int q=pos[l],p=pos[r];
if(q==p){
int ans=0;
for(int i=l;i<=r;i++)
++c[a[i]],ans=max(ans,c[a[i]]);
for(int i=l;i<=r;i++)c[a[i]]=0;
return ans;
}
int ans=f[q+1][p-1];
for(int i=l;i<=R[q];i++)
while(w[i]+ans<v[a[i]].size()&&v[a[i]][w[i]+ans]<=r)ans++;
for(int i=L[p];i<=r;i++)
while(w[i]-ans>=0&&v[a[i]][w[i]-ans]>=l)ans++;
return ans;
}
int main()
{
scanf("%d%d",&n,&m);
int T=sqrt(n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]),b[i]=a[i];
sort(b+1,b+1+n);
int mnt=unique(b+1,b+1+n)-b-1;
for(int i=1;i<=n;i++){
a[i]=lower_bound(b+1,b+1+mnt,a[i])-b;
v[a[i]].push_back(i);
w[i]=v[a[i]].size()-1;
}
for(int i=1;i*T<=n;i++)
++cnt,L[cnt]=R[cnt-1]+1,R[cnt]=i*T;
if(R[cnt]<n)++cnt,L[cnt]=R[cnt-1]+1,R[cnt]=n;
for(int i=1;i<=cnt;i++)
for(int j=L[i];j<=R[i];j++)pos[j]=i;
for(int i=1;i<=cnt;i++){
for(int j=i;j<=cnt;j++){
f[i][j]=f[i][j-1];
for(int k=L[j];k<=R[j];k++)
++c[a[k]],f[i][j]=max(f[i][j],c[a[k]]);
}
for(int k=L[i];k<=n;k++)c[a[k]]=0;
}
int last=0;
while(m--){
int l,r;
scanf("%d%d",&l,&r);
l^=last;r^=last;
printf("%d\n",last=Ask(l,r));
}
return 0;
}

P5048-[Ynoi2019 模拟赛]Yuno loves sqrt technology III【分块】的更多相关文章

  1. 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 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

    题目大意: 给你一个长为n的序列a,m次询问,每次查询一个区间的众数的出现次数,强制在线. 解题思路: 出题人题解 众所周知lxl是个毒瘤,Ynoi道道都是神仙题 首先得离散化. 分块后,预处理Fi, ...

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

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

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

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

随机推荐

  1. 如何在WPF中定义窗体模板

    参考网址:https://www.cnblogs.com/chenxizhang/archive/2010/01/10/1643676.html可以在app.xaml中定义一个ControlTempl ...

  2. Socket编程 Tcp和粘包

    大多数程序员都要接触网络编程,Web开发天天和http打交道.稍微底层一点的程序员,就是TCP/UDP . 对程序员来说,Tcp/udp的核心是Socket编程. 我的浅薄的观点---------理解 ...

  3. 将svn项目导出,再导入到其他工作空间

    方法一: 对于一致svn地址,本地没有的项目,直接eclipse中svn检出即可. 若本地有项目,但想导入到另一个工作空间(即拷贝一份,不想再从svn拉),则需要用export方法. 方法二(expo ...

  4. 未解决的html页面banner对不齐

    莫名其妙的问题,记录等待解决: 怎么讲呢?就是可能真的没有理解这句话,浏览器是否是需要这句话的,思考! <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML ...

  5. reids rdb与aof

    rdb:时合高并发场景,容易备份恢复,会丢失部分数据 1.默认开启的方式,可以进过压缩,可以根据时间点生成快照 2.数据量大的情况下恢复快 3.bgsave一边开启fork保存文件,一边继续响应客户端 ...

  6. Linux压缩解压 tar.gz格式的文件.查看tomcat是否运行

    tar命令详解 -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用 ...

  7. Learning ROS: rostopic pub yaml demo

    官方Tutorials中例程的等效命令: rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '{linear:[2.0, 0.0, 0.0 ...

  8. java IO操作,看完你应该就清晰了。

    前言: java中IO里的一些知识对于一个java新手来说,是比较难理解的.因为里面存在一些很绕的概念,比如: 1.到底是读入写出,还是读出写入: 2.我要将一个文件的内容拷贝到另一个文件是先用Inp ...

  9. Gitlab(2)- centos7.x 下安装社区版 Gitlab 以及它的配置管理

    前置准备:虚拟机安装以及配置相关 包含安装 centos7.8 虚拟机.设置静态 ip 等 https://www.cnblogs.com/poloyy/category/1703784.html 注 ...

  10. ICCV2021 | MicroNet:以极低的 FLOPs 改进图像识别

    ​前言:这篇论文旨在以极低的计算成本解决性能大幅下降的问题.提出了微分解卷积,将卷积矩阵分解为低秩矩阵,将稀疏连接整合到卷积中.提出了一个新的动态激活函数-- Dynamic Shift Max,通过 ...