题目大意:

给你一个长为n的序列a,m次询问,每次查询一个区间的众数的出现次数,强制在线。

解题思路:

出题人题解

众所周知lxl是个毒瘤,Ynoi道道都是神仙题

首先得离散化。

分块后,预处理Fi,j表示第i∼j块的众数的出现次数。此处要用一个桶,空间复杂度O(n),时间复杂度O(n√n)。

用vector按顺序存每个数值所有元素的出现位置。

再记录每个元素在相应vector里的下标p。

以上空间复杂度都是O(n)的。

考虑询问,中间的直接使用预处理出的Fi,j的值即可。设当前的答案ans=Fi,j。

考虑边界的元素。

显然,由于边界的数最多2√n个,所以最多使得答案增加2√n。

我们只需要检查这些边角的元素,每次判断这些数的出现次数能否达到ans+1。

对于左边的边角元素x,我们在相应的vector里找到下标为px+ans的元素yy,若y⩽ry⩽r,则说明该数值在范围内有至少ans+1ans+1个数,暴力++ans即可。

对于右边的边角元素x,我们在相应的vector里找到下标为px−ans的元素yy,若y⩾ly⩾l,则说明该数值在范围内有至少ans+1ans+1个数,暴力++ans即可。

每次询问对O(√n)个元素检查,++ans的次数为O(√n)次。所以查询的时间复杂度为O(m√n)。

总时间复杂度O((n+m)√n),空间复杂度O(n),lxl说达到了下界。

C++ Code:

#include<cstdio>
#include<cctype>
#include<vector>
#include<cstring>
#include<algorithm>
#define siz 708
#define N 500001
class istream{
char buf[],*s;
public:
inline istream(){
#ifndef ONLINE_JUDGE
freopen("input.txt","r",stdin);
#endif
fread(s=buf,,,stdin);
fclose(stdin);
}
inline istream&operator>>(int&rhs){
int f=rhs=;
for(;!isdigit(*s);++s)f=*s=='-';
for(;isdigit(*s);)
rhs=(rhs<<)+(rhs<<)+(*s++^'');
if(f)rhs=-rhs;
return*this;
}
}cin;
class ostream{
char buf[],*s;
public:
inline ostream(){s=buf;}
inline ostream&operator<<(int rhs){
if(rhs<)*s++='-',rhs=-rhs;
if(rhs==){
*s++='';
return*this;
}
static int w;
for(w=;w<=rhs;w*=);
for(w/=;w;w/=)*s++=(rhs/w)^'',rhs%=w;
return*this;
}
inline ostream&operator<<(const char&rhs){*s++=rhs;return*this;}
inline~ostream(){
fwrite(buf,,s-buf,stdout);
}
}cout;
int n,m,L[],R[],bel[N],blocks,mx[][],ans,tot[N],wz[N],a[N];
void init(){
blocks=(n-)/siz+;
for(int i=;i<=blocks;++i)L[i]=R[i-]+,R[i]=i*siz;
R[blocks]=n;
for(int i=;i<=blocks;++i){
memset(tot,,sizeof tot);
for(int j=L[i];j<=R[i];++j)bel[j]=i;
for(int j=i;j<=blocks;++j){
int&F=mx[i][j];
F=mx[i][j-];
for(int k=L[j];k<=R[j];++k)
F=std::max(F,++tot[a[k]]);
}
}
}
std::vector<int>ls,v[N];
int main(){
ls.push_back(-);
cin>>n>>m;
for(int i=;i<=n;ls.push_back(a[i++]))cin>>a[i];
std::sort(ls.begin(),ls.end());
ls.erase(std::unique(ls.begin(),ls.end()),ls.end());
for(int i=;i<=n;++i)v[a[i]=std::lower_bound(ls.begin(),ls.end(),a[i])-ls.begin()].push_back(i),wz[i]=v[a[i]].size()-;
init();
memset(tot,,sizeof tot);
while(m--){
int l,r;cin>>l>>r;
l^=ans,r^=ans;
ans=;
if(bel[l]==bel[r]){
for(int i=l;i<=r;++i)ans=std::max(ans,++tot[a[i]]);
for(int i=l;i<=r;++i)tot[a[i]]=;
}else{
ans=mx[bel[l]+][bel[r]-];
for(int i=l;i<=R[bel[l]];++i){
int it=wz[i];
while(it+ans<v[a[i]].size()&&v[a[i]][it+ans]<=r)++ans;
}
for(int i=L[bel[r]];i<=r;++i){
int it=wz[i];
while(it-ans>=&&v[a[i]][it-ans]>=l)++ans;
}
}
cout<<ans<<'\n';
}
return ;
}

[Ynoi2019模拟赛]Yuno loves sqrt technology III的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 记录这段时间java编程的小知识点

    记录这段时间java编程的小知识点 eclipse项目导入中文乱码 eclipse左侧目录结构变动 eclipse代码段左右移动 按tal键,是整体右移. 按shift  table 同时按,是整体左 ...

  2. 增强for、iterator迭代器

    因为初学java,对部分语法还模棱两可, 在做练习的时候,用增强for遍历字符串编译报错 所以来复习下增强for原理和适用范围 一.增强for概念 增强for(也成为for each循环)是JDK 1 ...

  3. 如何使用ESP8266、ESP8285做一个WiFi中继(WiFi信号放大器)

    准备工作 准备一个深圳四博智联科技有限公司的ESP-F 模组.或者四博智联科技的NODEMCU 当我们拿到ESP-F模块后,可以按照以下接线进行测试: 即 VCC.EN 接 3.3v.GPIO15 G ...

  4. 利用svn的补丁文件打包生成增量文件

    下面的代码是maven版本 1. 创建patch.txt增量文件 保存到 文件目录下 比如 E:\aa\patch.txt 2. 编写java代码 package utils; import java ...

  5. Asp.net APP 重置密码的方式

    在开发ASP.NET WEB APP的时候,时间长了容易忘记最初设置的密码,即使打开数据库也不好重置,因为密码都是加密存储在数据库中的.下面是几种通过代码重置密码的方式: 第一种: string re ...

  6. 移动端设备中1px适配

    方式1:伪类+transform实现,主要用transform中的scale缩放,缩放默认中心点是以x,y轴的50%处,因此需要用transform-origin调整中心点 html代码: <d ...

  7. selenium中切换浏览器不同tab 的操作

    from selenium import webdriverimport timedriver=webdriver.Chrome()driver.get('http://ui.imdsx.cn/uit ...

  8. Linux 操作系统目录结构

    /  根目录 # ls /bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp  var bin - ...

  9. URL和URL比较

    浅谈URI和URL URI(Uniform Resource Identifier)字面上的意思是,统一资源标示符 URL(Uniform Resource Locator),统一资源定位符 光从字面 ...

  10. nginx——配置 Nginx 错误页面优雅显示

    ...... http { location / { root html/www; index index.html index.htm; error_page 400 401 402 403 404 ...