P5048-[Ynoi2019 模拟赛]Yuno loves sqrt technology III【分块】
正题
题目链接: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【分块】的更多相关文章
- 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 ...
- [洛谷P5048][Ynoi2019模拟赛]Yuno loves sqrt technology III
题目大意:有$n(n\leqslant5\times10^5)$个数,$m(m\leqslant5\times10^5)$个询问,每个询问问区间$[l,r]$中众数的出现次数 题解:分块,设块大小为$ ...
- 洛谷P5048 [Ynoi2019模拟赛]Yuno loves sqrt technology III(分块)
传送门 众所周知lxl是个毒瘤,Ynoi道道都是神仙题 用蒲公英那个分块的方法做结果两天没卡过去→_→ 首先我们分块,预处理块与块之间的答案,然后每次询问的时候拆成整块和两边剩下的元素 整块的答案很简 ...
- P5048 [[Ynoi2019模拟赛]Yuno loves sqrt technology III]
为什么我感觉这题难度虚高啊-- 区间众数的出现次数- 计算器算一下 \(\sqrt 500000 = 708\) 然后我们发现这题的突破口? 考虑分块出来[L,R]块的众数出现个数 用 \(\text ...
- 洛谷 P5048 - [Ynoi2019 模拟赛] Yuno loves sqrt technology III(分块)
题面传送门 qwq 感觉跟很多年前做过的一道题思路差不多罢,结果我竟然没想起那道题?!!所以说我 wtcl/wq 首先将 \(a_i\) 离散化. 如果允许离线那显然一遍莫队就能解决,复杂度 \(n\ ...
- [Luogu5048] [Ynoi2019模拟赛]Yuno loves sqrt technology III[分块]
题意 长为 \(n\) 的序列,询问区间众数,强制在线. \(n\leq 5\times 10^5\). 分析 考虑分块,暴力统计出整块到整块之间的众数次数. 然后答案还可能出现在两边的两个独立的块中 ...
- [luogu5048] [Ynoi2019模拟赛] Yuno loves sqrt technology III
题目链接 洛谷. Solution 思路同[BZOJ2724] [Violet 6]蒲公英,只不过由于lxl过于毒瘤,我们有一些更巧妙的操作. 首先还是预处理\(f[l][r]\)表示\(l\sim ...
- [Ynoi2019模拟赛]Yuno loves sqrt technology III
题目大意: 给你一个长为n的序列a,m次询问,每次查询一个区间的众数的出现次数,强制在线. 解题思路: 出题人题解 众所周知lxl是个毒瘤,Ynoi道道都是神仙题 首先得离散化. 分块后,预处理Fi, ...
- [Ynoi2019模拟赛]Yuno loves sqrt technology II(二次离线莫队)
二次离线莫队. 终于懂了 \(lxl\) 大爷发明的二次离线莫队,\(\%\%\%lxl\) 二次离线莫队,顾名思义就是将莫队离线两次.那怎么离线两次呢? 每当我们将 \([l,r]\) 移动右端点到 ...
- [Ynoi2019模拟赛]Yuno loves sqrt technology II
题目大意: 给定一个长为\(n\)的序列,\(m\)次询问,每次查询一个区间的逆序对数. 32MB. 解题思路: 出题人题解 众所周知lxl是个毒瘤,Ynoi道道都是神仙题 二次离线莫队. 对于每个区 ...
随机推荐
- Ubuntu防火墙:ufw
原始linux的防火墙是iptables,以为过于繁琐,各个发行版几乎都有自己的方案; ubuntu下的防火墙是ufw[ubuntu fireward的缩写],centos的防火墙是fireward ...
- Mybatis一对一、一对多、多对多查询。+MYSQL
场景:使用三张数据表:student学生表.teacher教师表.position职位表 一个学生可以有多为老师.一位老师可以有多个学生.但是一个老师只能有一个职位:教授.副教授.讲师:但是一个职位可 ...
- 详细解读go语言中的map
Map map底层是由哈希表实现的 Go使用链地址法来解决键冲突. map本质上是一个指针,指向hmap 这里的buckets就是桶,bmap 每一个bucket最多可以放8个键值对,但是为了让内存排 ...
- ES6 promise的应用
html部分 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <me ...
- 关于notepad++使用的那些事儿
时间:2019-04-11 整理:PangYuaner 标题:Notepad++正则表达式语法 地址:https://www.cnblogs.com/kekec/p/5255475.html 标题:N ...
- 在已有Win7/10系统电脑中加装Ubuntu18.04(安装双系统)
准备一台有Win7/10的电脑. 为Ubuntu预留硬盘空间.最好在硬盘最后保留一个空闲分区.(Ubuntu会自动安装到后面的空闲分区) 用Universal USB Installer制作安装盘(U ...
- [源码解析] 深度学习流水线并行之PopeDream(1)--- Profile阶段
[源码解析] 深度学习流水线并行之PopeDream(1)--- Profile阶段 目录 [源码解析] 深度学习流水线并行之PopeDream(1)--- Profile阶段 0x00 摘要 0x0 ...
- AWS扩容EC2实例根空间
文章原文 aws 端操作 先在EC2 实例中选中磁盘 然后打开跟设备 修改大小后保存 ec2 端操作 lsblk 查看当前设备的磁盘编号 df -T -H 查看扩容前的空间大小并确定磁盘格式 grow ...
- MySQL——MySQL安装
1.rpm yum安装:安装方便.速度快.无法定制 2.二进制安装:解压即可使用,不能定制功能 3.编译安装: 可定制.安装慢: MySQL5.5之前:./configure make make in ...
- NOIP模拟「random·string·queen」
T1:random 我又来白剽博客了: 详细证明请看土哥 土哥写的不是很详细,我在这里详细写一下: 首先,对于f[n]的式子: 加一是那一个对的贡献,大C是选其余的几个数,\(2^ ...