正题

题目链接: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. python中的logging日志

    logging使用 import logging import os from logging import handlers from constants.constants import Cons ...

  2. windows上python3安装

    下载python 下载地址 https://www.python.org/downloads/windows/ 安装python 1.添加python到环境变量 2.自定义安装 3.下一步 4.选择安 ...

  3. Spring详解(九)------事务管理

    1.事务介绍 事务(Transaction),一般是指要做的或所做的事情.在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit). 这里我们以取钱的例子来讲解:比如你去ATM ...

  4. Maven脑图

    转自:https://segmentfault.com/a/1190000017832792 参考:https://www.cnblogs.com/mzywucai/p/11053341.html

  5. [源码解析] 深度学习流水线并行 GPipe(3) ----重计算

    [源码解析] 深度学习流水线并行 GPipe(3) ----重计算 目录 [源码解析] 深度学习流水线并行 GPipe(3) ----重计算 0x00 摘要 0x01 概述 1.1 前文回顾 1.2 ...

  6. 移动端动画——requestAnimationFrame

    window.requestAnimationFrame() 告诉浏览器--你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画.该方法需要传入一个回调函数作为参数,该回调函数会 ...

  7. Ecplise项目导入IDEA(纯小白名词解释)

    1. Module 模块 一个大的项目不仅仅是只有Java的源文件,还有数据库,服务器,web等等文件一起使用,将类似于这样分类的文件定义为 module 例如 core Module(核心).web ...

  8. tomcat配置启动不了

    关于ideatomcat配置问题 1.第一步配置tomcat启动器 2.配置启动的网址 3.配置启动器的启动 ---更多java学习,请见本人小博客:https://zhangjzm.gitee.io ...

  9. Pulsar の 保证消息的顺序性、幂等性和可靠性

    原文链接:Pulsar の 保证消息的顺序性.幂等性和可靠性 一.背景 前面两篇文章,已经介绍了关于Pulsar消费者的详细使用和自研的Pulsar组件. 接下来,将简单分析如何保证消息的顺序性.幂等 ...

  10. B. 2194: 快速傅立叶之二解题报告

    $$\begin{eqnarray}&c[k] = \sum_{i}^{n}a[i]b[i-k] \\&c[k] = \sum_{i}^{n}a[n-i]b[i-k] (倒序保存a) ...