为什么我感觉这题难度虚高啊……

区间众数的出现次数…

计算器算一下 \(\sqrt 500000 = 708\)

然后我们发现这题的突破口?

考虑分块出来[L,R]块的众数出现个数 用 \(\texttt{mx[L][R]}\) 维护就可以了

每次考虑一个L… 然后R指针一直向右移不断的更新到N 这样子做的复杂度因为最多有 \(\sqrt n\) 个块 所以复杂度大概是 \(n\sqrt n\) 实际上还少一点…

然后整块的想好了……单独的怎么处理?

分类讨论

1 \(\texttt{L}\)和\(\texttt{R}\) 所在的块相同 那么分块的常规暴力操作(记得清空…)复杂度保证是 \(\sqrt n\)的

2 不在一个块的话 考虑用一种其他方法…记录一个\(\texttt{v[i]}\)存的是每个 数值 i 的出现位置 再记录一个 \(\texttt{pos[i]}\) 表示 i 这个数值在序列里是第几次出现…(主要还是方便vector的操作…)

您已经统计出来了 \(\texttt{L-R}\) 的最多次数 肯定是保底 \(\texttt{mx[L][R]}\) 了 根据这个基础 这样指针移动就相对来说保证了复杂度…每次也是\(\sqrt n\)的

讲下具体操作 记录了这个 \(pos_i\) 是 i 在 \(a_i\) 第几个出现 然后 \(v_{a_i}\)是记录了每个 \(a_i\)的出现位置 于是就可以 在左半区间的时候判断是否\(\leq \texttt{R}\) 在右半区间的时候判断是否\(\ge\texttt{L}\) 如果满足条件就加大 当前的\(\texttt{ans}\) 直到不满足 肯定是最优的…

#include<bits/stdc++.h>
using namespace std ;
const int N = 5e5 + 10 ;
int n , m , a[N] , b[N] , bl[N] , unt = 0 , L[710] , R[710] , mx[710][710] , tot[N] , pos[N] ;
vector < int > v[N] ;
inline int query(int l , int r) { int ans = 0 ;
if(bl[l] == bl[r]) {
for(register int i = l ; i <= r ; i ++) tot[a[i]] = 0 ;
for(register int i = l ; i <= r ; i ++) ans = max(ans , ++ tot[a[i]]) ;
return ans ;
} ans = mx[bl[l] + 1][bl[r] - 1] ;
for(register int i = l ; i <= R[bl[l]] ; i ++) {
int it = pos[i] ; while(it + ans < v[a[i]].size() && v[a[i]][it + ans] <= r) ++ ans ;
}
for(register int i = L[bl[r]] ; i <= r ; i ++) {
int it = pos[i] ; while(it - ans >= 0 && v[a[i]][it - ans] >= l) ++ ans ;
} return ans ;
}
signed main() {
// freopen("0.in" , "r" , stdin) ;
ios :: sync_with_stdio(false) ;
cin.tie(0) ;cout.tie(0) ;
cin >> n >> m ;
for(register int i = 1 ; i <= n ; i ++) { cin >> a[i] ; b[i] = a[i] ; }
sort(b + 1 , b + n + 1) ;
int len = unique(b + 1 , b + n + 1) - b - 1 ;
for(register int i = 1 ; i <= n ; i ++) { a[i] = lower_bound(b + 1 , b + len + 1 , a[i]) - b ; }
for(register int i = 1 ; i <= n ; i ++) { v[a[i]].push_back(i) ; pos[i] = v[a[i]].size() ; pos[i] -- ; }
int unt = sqrt(n) ;
for(register int i = 1 ; i <= n ; i ++) bl[i] = (i - 1) / unt + 1 ;
for(register int i = 1 ; i <= bl[n] ; i ++) { L[i] = (i - 1) * unt + 1 ; R[i] = i * unt ; }
R[bl[n]] = n ;
for(register int i = 1 ; i <= bl[n] ; i ++) {
memset(tot , 0 , sizeof(tot)) ;
for(register int j = i ; j <= bl[n] ; j ++){
mx[i][j] = mx[i][j - 1] ;
for(register int k = L[j] ; k <= R[j] ; k ++) mx[i][j] = max(mx[i][j] , ++ tot[a[k]]) ;
}
}
int lastans = 0 ;
for(register int i = 1 ; i <= m ; i ++) {
int l , r ; cin >> l >> r ;
l ^= lastans ; r ^= lastans ;
if(l > r) swap(l , r) ;
cout << (lastans = query(l , r)) << '\n' ;
}
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. 洛谷P5048 [Ynoi2019模拟赛]Yuno loves sqrt technology III(分块)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 51nod 1002 数塔取值问题 dp

    动态规划 1002 数塔取数问题 1.0 秒 131,072.0 KB 5 分 1级题   一个高度为N的由正整数组成的三角形,从上走到下,求经过的数字和的最大值. 每次只能走到下一层相邻的数上,例如 ...

  2. 计算机网络 From Mr.Liu

    引言 本博客摘自Mr.Liu,原帖请点击这里. 感谢Mr.Liu,这个文章很充分的描述了计算机网络的核心知识点. 我还在学习中,所以没有进行自己的转述.图片因为是copy代码而没有获得,想看更详尽的, ...

  3. 如何在命令行添加换行符到git commit -m "xxx"

    需求来源: 需要将自动识别的组件信息.更新信息.任务跟踪单号.下载链接等信息自动提交并推送至gerrit, 然后作为触发条件启动另一个协作业务流程. 方法1:单引号开放方法 git commit -m ...

  4. 2019IT运维大会上海站 智和信通解析等保2.0支撑

    2019IT运维大会上海站 智和信通解析等保2.0支撑 2019年11月14日上午8:30-12:10,上海锦荣国际大酒店二层锦荣厅

  5. centos7配置Logstash同步Mysql数据到Elasticsearch

    Logstash 是开源的服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的“存储库”中.个人认为这款插件是比较稳定,容易配置的使用Logstash之前,我们得明确 ...

  6. Git分支管理介绍

    分支管理 软件的版本控制以及分支管理贯穿于整个软件产品的生命周期,日常的项目管理对于开发团队能否有节奏且顺利的交付软件也很重要.本分支管理和版本控制规范主要分为3个部分,即分支管理规范.版本号规范.需 ...

  7. 从零构建Flink SQL计算平台 - 1平台搭建

    一.理想与现实 Apache Flink 是一个分布式流批一体化的开源平台.Flink 的核心是一个提供数据分发.通信以及自动容错的流计算引擎.Flink 在流计算之上构建批处理,并且原生的支持迭代计 ...

  8. powersploit的两个信息收集的脚本

    0x00 简介 powersploit是基于powershell的渗透工具包,里面都是powershell的脚本工具文件.工具包地址:https://github.com/PowerShellMafi ...

  9. OpenCV检测Marker位姿

    Marker检测采用小觅相机,可以实时检测Marker的位置和姿态,效果如下: 参考代码如下: #include "pch.h" #include <Eigen/Dense& ...

  10. Django之F与Q查询

    F查询 from django.db.models import F,Q # 1.查询库存数大于卖出数的书籍 res = models.Book.objects.filter(kucun__gt=F( ...