正题

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


题目大意


就是这个

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

长度为nnn的序列,要求支持查找区间众数出现次数。
强制在线

1≤n,m≤5×1051\leq n,m\leq 5\times 10^51≤n,m≤5×105


解题思路

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

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

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

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

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


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. [洛谷P5048][Ynoi2019模拟赛]Yuno loves sqrt technology III

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

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

    题目大意: 给定一个数列,每次询问区间逆序对数,不强制在线. 题解: 如果不强制在线的话,我们可以离线下来搞一个莫队,每次指针左右移动的时候相当于查当前区间中有多少数比它大或者有多少数比它小,这个需要 ...

  3. 2021年 第12届 蓝桥杯 第4次模拟赛真题详解及小结【Java版】

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...

  4. 2020年 第11届 蓝桥杯 第2次模拟赛真题详解及小结【Java版】

    蓝桥杯 Java B组 省赛真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 注意:部分代码及程序 源自 蓝桥杯 官网视频(历年真题解析) 郑未老师. 2013年 第04届 蓝桥杯 ...

  5. 模拟赛-20190114-新魔法(distance)

    前言 第一篇模拟赛题思路总结 题目相关 题目链接 题目大意 给定一个长度为nnn序列,每一个位置iii都有一种颜色aia_iai​ 现在有mmm次操作,操作分两种: 第一种操作,将所有颜色xxx都替换 ...

  6. 蓝桥杯省内模拟赛解题过程

    今天参加了一场蓝桥杯模拟赛,做的咋样还不知道,本博客的题解只是我提交的代码,并不代表真正的题解,大家参考着看看吧. 题目一 问题描述 将LANQIAO中的字母重新排列,可以得到不同的单词,如LANQI ...

  7. 省选模拟赛记录(越往下越新哦~~~)

    LOG 模拟赛 第一次见尼玛这么给数据范围的-- 开考有点困,迷迷糊糊看完了三道题,真的是像老吕说的那样,一道都不会-- 思考T1,感觉有点感觉,但是太困了,就先码了暴力,发现打表可以50分,于是就大 ...

  8. c++判断奇偶_第十一届(今年)蓝桥杯省模拟赛 试题+源码 C/C++详解

    后台回复开发工具,免费获取C语言常用编译器 本文章来源:CSDN|亓官劼 本文是第十一届蓝桥杯省模拟赛的试题和部分题解,博主参加的是4.13日的下午场,也就是本次模拟赛的第一天了吧,不知道有没有上午场 ...

  9. NOIP2017提高组模拟赛4 (总结)

    NOIP2017提高组模拟赛4 (总结) 第一题 约数 设K是一个正整数,设X是K的约数,且X不等于1也不等于K. 加了X后,K的值就变大了,你可以重复上面的步骤.例如K= 4,我们可以用上面的规则产 ...

最新文章

  1. 037_JDK的Iterator接口
  2. SpringCloud之五大组件
  3. GDCM:制作模板的测试程序
  4. Asp.NET Core 如何使用ElasticSearch和Kibana创建仪表板
  5. 开关灯(jzoj 3926)
  6. Android图片的Base64编码与解码
  7. 【华为云技术分享】Spark如何与深度学习框架协作,处理非结构化数据
  8. ubantu安装mysql卡住_ubuntu安装mysql遇到的问题
  9. 附上堆和栈的区别 (转贴)
  10. Anaconda下载安装教程
  11. Hololens Holographic Remoting
  12. html图片自动跳转,点击图片跳转链接(html点击图片跳转链接)
  13. 那些编程中遇到的常见英文缩写
  14. python 后台运行及关闭后台程序
  15. JAVA GUI同一个窗体切换面板JPanel以及获取JFrame方法的注意事项
  16. Iphone 苹果手机HEIC照片格式 win10电脑打开 解决方案
  17. freeswitch mrcp 源码分析--数据包的发送
  18. 信息系统开发方法以及其应用-系统分析师论文-2022年上半年必考知识点
  19. html图片超出内容隐藏,图片按比例缩小,溢出超出DIV边框的内容自动隐藏方法!...
  20. Otterctf 2018 内存取证

热门文章

  1. mybatis 多租户saas_MybatisPlus 多租户架构(SaaS)实现
  2. bpmn文件的标签为何都以bpmn2开头_C语言之两种作用域:函数的作用域与文件作用域...
  3. python中数据用折线图表示_用python处理文本数据
  4. 什么?面试官问我Java内存模型!这不得给我加薪?
  5. c语言while运行出现错误,【图片】为什么我的while(1)不执行啊?【c语言吧】_百度贴吧...
  6. php5.2 zengd,大对杀狗狗再犯低级错误 ZEN狂输200目笑翻棋友
  7. java打包拆包_[Java] Java 打包成jar包 和 解压jar包
  8. 揭秘python的5种最佳调试方法_揭秘 IPython 的 5 种最佳调试方法-阿里云开发者社区...
  9. linux truncate文件,linux系统编程:用truncate调整文件大小
  10. java的scanner的方法_Java Scanner reset()方法