洛谷P4137 Rmq Problem / mex(区间mex/主席树)

P4137 Rmq Problem / mex (三种解法: 权值线段树+询问离线 / 可持久化线段树 / 莫队+值域分块) 题目链接: P4137 Rmq Problem / mex 大致题意 给定一个长度为nnn的序列, 有mmm次询问操作. 每次询问[l,r][l, r][l,r]区间的mexmexmex是多少. 解题思路 解法一: 权值线段树 + 询问离线 我们考虑把所有的询问按照右端点rrr从小到大排序, 用权值线段树维护[1,r][1, r][1,r]区间中所有数值最后一次出现位置的最小值. 对于询问区间[l,r][l, r][l,r], 我们在树上进行二分, 如果当前值域左区间的最小出现位置要小于lll, 则访问左区 阅读详情

题目

有一个长度为 n(n<=2e5) 的数组 \{a_1,a_2,\ldots,a_n\}(0<=ai<=1e9)。

m(m<=2e5)次询问,第i次询问给出一个区间(li,ri),

询问该区间内,没有出现过的最小自然数。

思路来源

https://www.luogu.com.cn/problem/solution/P4137

题解

bzoj3339/bzoj3585 静态区间mex

首先,第i棵树维护的是只考虑[1,i]的值时,值域的最右位置,贪心

注意到答案只可能在[0,n]中,故直接忽略>n的ai值,令root[i]继承root[i-1],

否则,则更新最右位置,pushup的时候维护区间最右位置的最小值,

对于询问[l,r],去查询第r棵树的值域对应的位置,

如果左子树的位置最小值>=l,说明左子树的值都存在,则访问右子树,否则访问左子树

 

也可以对原数组离散化,未出现的最小自然数只有可能是 0 或是 1+ai,

因此只需对元素0、ai,1+ai离散化

 

本题也有莫队做法,很暴力,首先把区间按块排序,再考虑add和del,

del时,如果删掉了一个小值,mex如果变小,就O(1)更新,

add时,如果把原来的mex出现次数+1,就O(暴力)往上找最小的mex

复杂度,按评论区来说,似乎是假的,所以这里就不写了

 

线段树二分的做法,考虑把区间离线,按右端点排增序,

类似主席树的处理过程,一边询问一边询问,于是一棵线段树就解决了

代码(主席树)

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,m,l,r,a[N];
int root[N],ls[50*N],rs[50*N],rig[50*N],c;
//每棵主席树维护每个值出现的当前最右位置
void upd(int l,int r,int &cur,int las,int pos,int v){
	cur=++c;
    ls[cur]=ls[las];rs[cur]=rs[las];
	if(l==r){
        rig[cur]=v;
        return;
	}
	int mid=(l+r)/2;
	if(pos<=mid)upd(l,mid,ls[cur],ls[las],pos,v);
	else upd(mid+1,r,rs[cur],rs[las],pos,v);
	rig[cur]=min(rig[ls[cur]],rig[rs[cur]]);//若区间min>=l 则所有>=l
}
int ask(int cur,int l,int r,int v){
    if(!cur || l==r){
        return l;
    }
    int mid=(l+r)/2;
	if(rig[ls[cur]]<v){
        return ask(ls[cur],l,mid,v);
	}
	return ask(rs[cur],mid+1,r,v);
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;++i){
        scanf("%d",&a[i]);
        if(a[i]>n){
            root[i]=root[i-1];
        }
        else{
            upd(0,n,root[i],root[i-1],a[i],i);//值域区间中 当前区间出现的最大位置
        }
    }
    while(m--){
        scanf("%d%d",&l,&r);
        printf("%d\n",ask(root[r],0,n,l));//最小的值域区间中 位置<l的值
    }
    return 0;
}

 

边缘计算【智能+安全检测】系列教程--使用OpenCV+GStreamer实现真正的硬解码,完全消除马赛克 通过现有博客的GStreamer的解码方式解码,大多情况应该存在上图马赛克的问题,请勿紧张,其实上述url并没有调用硬件解码,后面有调用硬件解码的ULR,我们来在接下来的介绍中释获。通过RTSP协议连接海康威视摄像头将图片送入AI推理,发现OpenCV的VideoCapture使用的是软解码大量消耗了cpu的资源,并无法做到实时数据处理存在5秒钟的延时。只能把解码这部分送到硬件解码器去处理分摊掉cpu的压力, 阅读详情

相关推荐

Xilinx Blockset Counter计数器模块使用及参数配置

本文详细介绍了Simulink中Xilinx Blockset库Counter模块的使用以及参数说明。

白码王子小张的博客 1093

BZOJ 3585&&3339 静态区间mex【主席树】

直接上一发主席树就好了吖: #include &lt;cmath&gt; #include &lt;cstdio&gt; #include &lt;cstring&gt; #include &lt;iostream&gt; #include &lt;algorithm&gt; #define db double #define sg string #define make make_pair #d...

Yucohny 465

开放平台 - 互动玩法演进之路

随着直播业务和用户规模日益壮大,如何丰富直播间内容、增强直播间内用户互动效果,提升营收数据变得更加关键。

bilibili_TC的博客 1737

洛谷 P4137 Rmq Problem / mex 莫队

题目描述 有一个长度为n的数组{a1,a2,…,an}。m次询问,每次询问一个区间内最小没有出现过的自然数。 输入输出格式 输入格式: 第一行n,m。 第二行为n个数。 从第三行开始,每行一个询问l,r。 输出格式: 一行一个数,表示每个询问的答案。 输入输出样例 输入样例#1: 5 5 2 1 0 2 1 3 3 2 3 2 4 1 2 3 5 输出样例#1...

liangzihao1的博客 262

看完让你的RSA提升一个台阶 [GKCTF 2021]RRRRsa

我是,今天我给大家分享一个关于RSA的题目,带大家领略的魅力。今天开始前,我们先学习一下。

m0_62102520的博客 848

神经网络(十五)在VS Code下搭建PyTorch环境

pytorch在vscode中的配置和使用

就随便写写.... 5万+

P4137 Rmq Problem / mex 【莫队】【主席树+思维】

传送门 题目上给的 ai <= 1e9,第一反应就是离散化,细想一下区间一共就2e5,答案最大不就是2e5吗,大于2e5的数我们可以忽略,这样就可以减去离散化的步骤。 莫队解题思路:莫队的就是优雅的暴力,我们可以直接暴力去找答案(稍微优雅一下),我们记录当前区间中每个数出现的位置,当我们的区间移动时。增加操作:如果增加的数==Ans,那我们的答案就会更新,然后暴力向后判断(只有这里最暴力...

qq_42211531的博客 325

第 2 章:PassThrough 直通滤波

通过设置某个维度(如 x、y、z 或 rgb)的取值范围,仅保留该范围内的点,从而达到**点云裁剪(裁边)**或过滤异常值的目的。所有在该范围之外的点会被移除(可选是否保留);点云中包含背景、地面或传感器噪声,需要过滤;通过 z 轴过滤,只保留桌面上方的物体;多轴组合过滤(如同时过滤 x、y、z);可用于地面剔除、车载点云预处理等场景。不支持一次过滤多个字段,可多次调用;仅处理某一层或某一区域的点云数据。原始点云中包含地面、墙面、背景等;在区域裁剪、前景提取中广泛使用;设定一个轴(如z轴);

yumeiguo的博客 336

区间MEX 线段树维护mex数组

NKOJ 4254 区间MEX问题描述 给你一个长度为n的数列,元素编号1到n,第i个元素值为Ai。现在有m个形如(L,R)的提问,你需要回答出区间[L,R]的mex值。即求出区间[L,R]中没有出现过的最小的非负整数。 输入格式 第一行,两个整数n和m 第二行,n个空格间隔的整数,表示数列A 接下来m行,每行两个整数L,R,表示一次询问 输出格式 m行,每行一个整数,表示对

rgnoH的博客 4183

C++(Qt)软件调试---静态分析工具clang-tidy(18)

现在很多人在开发中完全忽略了编译器、IDE的警告提示,这怎么可能写出稳定的程序。 clang-tidy是一个由LLVM项目提供的开源工具,是一个静态分析工具,用于进行静态代码分析和代码质量改进。

mahuifa的博客 5078

影楼精修-高低频磨皮算法解析

本文介绍了像素蛋糕软件中的高低频磨皮算法原理及实现思路,抛砖引玉。

Trent1985的专栏 2254

【洛谷P4137】Rmq Problem / mex【主席树】

题目大意: 题目链接:https://www.luogu.org/problemnew/show/P4137 有一个长度为nnn的数组{a1,a2,…,an}\{a1,a2,…,an\}{a1,a2,…,an}。mmm次询问,每次询问一个区间内最小没有出现过的自然数。 思路: 显然主席树。 对于第kkk棵线段树,设叶子节点iii表示在数列前kkk个数字中,数字iii出现的最后位置。 显然a[]a...

stoorz 377

CMake是什么?为什么学习CMake

CMake的主要作用和重要性,包括其在跨平台构建中的应用、如何支持多种编译器及操作系统,以及它在管理大型和复杂项目中的优势。

小鱼酱的博客 3866

【洛谷 P4137】 Rmq Problem / mex(主席树)

题目链接 容易发现,可能答案只有\(0\)、每个数,每个数\(+1\) 于是把这\(2n+1\)个数建立一个权值线段树,可持久化一下,每个节点记录这个子树中最后加入数加入的时间的最小值\(latest\)(好好理解一下)。 对于查询\((l,r)\),线段树上二分找到最小的\(latest<l\)的叶节点,那么答案就是这个节点代表的数。 #include <cstdio> #in...

weixin_34110749的博客 210

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

luogu P4137 Rmq Problem / mex 主席树 + 思维

Code: #include<bits/stdc++.h> #define maxn 200001 using namespace std; void setIO(string s) { string in=s+".in"; freopen(in.c_str(),"r",stdin); } namespace tr { #define mid (...

EM LGH 192

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

洛谷 P4137 Rmq Problem / mex(主席树)

const int N=3e5+5; int n,m,_; int i,j,k; int a[N]; struct Node { int l,r; int sz; int minn; void update(int x){ sz++; minn=x; } }t[N<<5]; int root[N],tot=0; void push_up(int id) { ...

C_Dreamy的博客 450

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

洛谷 P4137 Rmq Problem / mex 可持久化线段树 / 莫队

https://www.luogu.com.cn/problem/P4137 解法1:可持久化线段树 因为需要查询区间内未出现过的自然数,维护的是数是否有出现,所以大概要往权值线段树那个方向靠 用tre[i]表示树节点 root[i]表示每一棵树的树根 对于第i颗树,其树上的叶子节点表示 : 数组的第1~第i个数中,叶子节点所代表的那个数x出现的最靠右的距离 其余节点则维护节...

forOnward的博客 515

[洛谷P4137]Rmq Problem / mex

不错的莫队题目(悄悄说一句,不一定非要莫队哦)

七代目鸽影 416

P4137 Rmq Problem / mex

题目描述 有一个长度为n的数组{a1,a2,…,an}。m次询问,每次询问一个区间内最小没有出现过的自然数。 输入输出格式 输入格式: 第一行n,m。 第二行为n个数。 从第三行开始,每行一个询问l,r。 输出格式: 一行一个数,表示每个询问的答案。 输入输出样例 输入样例#1: 5 5 2 1 0 2 1 3 3 2 ...

weixin_30702887的博客 126

洛谷 P4137 Rmq Problem / mex (普通莫队 and 值域分块)

题目传送门 ~~~ 题目大意 有一个长度为 n 的数组 a m 次询问,每次询问一个区间内最小没有出现过的自然数。 所有数据小于 2e5 思路 无修的区间查询,考虑莫队,好像可以写,因为只需要统计每个数字出现的次数,写了,交了,TIE /(ㄒoㄒ)/~~ 思考,发现删除数据的时候 mex 特别容易维护,删掉一个数,这个数出现次数变为零,比较一下它会不会成为 mex 就好。 但是,增加数据的时候 mex 的维护就很麻烦,暴力找,稳TIE。 查了一下,说给值域进行分块就行了,这样维护mex的时间复杂度可以.

mldl_的博客 287

洛谷 P4137 Rmq Problem /mex 解题报告

P4137 Rmq Problem /mex 题意 给一个长为\(n(\le 10^5)\)的数列\(\{a\}\),有\(m(\le 10^5)\)个询问,每次询问区间的\(mex\) 可以莫队然后对值域分块,这样求\(mex\)的复杂度就正确了 一种更优的做法是按值域建可持久化线段树,对每个节点维护当前值域区间的最小出现位置,然后查询的时候就从\(r\)的那棵树一直尽量往左边走就好了 Co...

weixin_30457881的博客 171

CF 1436E-Complicated Computations 线段树维护区间MEX

不多说,上代码,代码里有详细的思路解释 #include <cstdio> #include <cstring> #include <climits> #include <vector> #include <cmath> #include <algorithm> using namespace std; typedef long long LL; typedef pair<int,int> pii; #define pE

qq_42705770的博客 441

关于区间 $mex$ 的几种做法

关于区间 \(mex\) 的几种做法 题目链接 题目大意 在求 \(SG\) 函数时提到过一个 \(mex\) 函数; \(mex(\{a_i\})\) 表示在 \(a\) 中未出现的最小自然数,其中 \(a_i \in \N\)。 给一个长度为 \(n\) 的序列 \(a\),\(m\) 次查询,每次查询 \(mex(\{a_i\}),i \in [l,r]\) 1、莫队+树状数组 权值树状数组...

weixin_30770495的博客 537

洛谷 P4137 Rmq Problem / mex(莫队+值域分块)

看到这个题目后,删除 O(1) 添加 O(n),做法就是遍历区间 [now,n] 但是最后一个点会T 看到有人说值域分块可以过,虽然最后一个点过了,但是前面又过不了了,最后还是要开 O2 void add(int pos) //暴力添加代码 { int x=a[pos]; if(!vis[x] && now==x){ for(int i=x+1;i<=n+1;i++){ if(!vis[i]){ now=i; b...

C_Dreamy的博客 517

P4137 Rmq Problem / mex(主席树)

主席树求mex

我们都有光明的未来 211

线段树-Mex-洛谷P4137

Mex 问题提出 有一个长度为nnn的数组{a1,a2,…,an}\{a_1,a_2,…,a_n\}{a1​,a2​,…,an​}。mmm次询问,每次询问一个区间内最小没有出现过的自然数。 题目解答 对1−n1-n1−n这里能够的每个数xxx,都统计出来在数组中出现的位置,并在前补上000,在后补上n+1n+1n+1. 例如数组{1,2,3,2,1}\{1,2,3,2,1\}{1,2,3,2,1}...

SUNSET 338
上一篇: 洛谷P2325 [SCOI2005]王室联邦(树分块)
下一篇: 2019西北大学集训队选拔赛(重现赛)D.温暖的签到题(线段树)
小衣同学
博客等级 码龄9年 1444粉丝 995原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小衣同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值