NOIP集训 P4137 Rmq Problem / mex 题解

news/2024/11/16 17:10:16/文章来源:https://www.cnblogs.com/Ydoc770/p/18547716

前置指使:可持久化线段树

题解:P4137 Rmq Problem / mex

有一个长度为 \(n\) 的数组 \(\{ a_1,a_2,...,a_n \}\)
\(m\) 次询问,每次询问一个区间内最小没有出现过的自然数。

Input

第一行,两个正整数 \(n,m\)
第二行,\(n\) 个非负整数 \(a_1, a_2,...,a_n\)
接下来 \(m\) 行,每行两个正整数 \(l,r\),表示一次询问。

Output

输出 \(m\) 行,每行一个数,依次表示每个询问的答案。

Note

对于 \(100\%\) 的数据:\(1\le n,m\le 2e5, 1\le l\le r\le n,0\le a_i\le 2e5\)

分析

思考 \(mex\) 的本质。对于一段给定的区间,\(mex\) 即是从 \(0\) 开始存在的连续值域的最大值加 \(1\)。若 \(0\) 不在区间值域中则 \(mex\)\(0\)
在值域线段树上考虑问题。序列中的值暂时不用考虑,因为可以二分值域直接处理。对于 \([l,r]\)\(mex\) ,即是要找到一个最小的 \(i\) ,使得这个 \(i\) 最后出现的位置 \(last_i\) 小于 \(l\)
所以可以在主席树上维护每个值出现位置的 \(min\),注意加入时要把 \(x\) 加上 \(1\) ,再在查询时减去 \(1\) 防止值域出现问题.
数据不需要离散化。同时,对于大于 \(n\)\(a_i\) 显然对答案没有任何贡献,因为这时必然存在一个小于等于 \(n\)\(mex\)

AC代码:

#include<bits/stdc++.h>
using namespace std;inline int read() {int f = 1, otto = 0;char a = getchar();while(!isdigit(a)) {if(a == '-') f = -1;a = getchar();}while(isdigit(a)) {otto = (otto << 1) + (otto << 3) + (a ^ 48);a = getchar();}return f * otto;
}const int maxn = 2e5 + 10;
int ver;
int rt[maxn], tr[maxn << 5], ls[maxn << 5], rs[maxn << 5];void upd(int &u1, int u2, int l, int r, int num, int loc) {if(!u1) u1 = ++ver;if(l == r) return tr[u1] = loc, void(0);int mid = l + r >> 1;if(num <= mid) rs[u1] = rs[u2], upd(ls[u1], ls[u2], l, mid, num, loc);else ls[u1] = ls[u2], upd(rs[u1], rs[u2], mid + 1, r, num, loc);return tr[u1] = min(tr[ls[u1]], tr[rs[u1]]), void(0);
} int ask(int u, int l, int r, int lim) {if(l == r) return l;int mid = l + r >> 1;if(tr[ls[u]] < lim) return ask(ls[u], l, mid, lim);else return ask(rs[u], mid + 1, r, lim); 
}int main() {int n = read() + 1, m = read();for(int i = 1; i < n; i++) {int x = read() + 1;if(x > n) rt[i] = rt[i - 1];else upd(rt[i], rt[i - 1], 1, n, x, i);}while(m--) {int l = read(), r = read();printf("%d\n", ask(rt[r], 1, n, l) - 1);}return 0;
}

小结:

对于类似的题套路性很强,但是转化具有一定的思维难度。要多做题,多见题才更能掌握主席树的应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/834667.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20222315 2024-2025-1 《网络与系统攻防实验六实验》实验六实验报告

1、实验内容 本实践目标是掌握metasploit的用法。 指导书参考Rapid7官网的指导教程。 https://docs.rapid7.com/metasploit/metasploitable-2-exploitability-guide/ 下载官方靶机Metasploitable2,完成下面实验内容。 (1)前期渗透 ①主机发现(可用Aux中的arp_sweep,search…

《Django 5 By Example》阅读笔记:p165-p210

《Django 5 By Example》学习第6天,p165-p210总结,总计46页。 一、技术总结 1.bookmarks项目 (1)登录认证 作者这里使用的是Django自带的auth。 (2)上传头像 图片处理,使用Pillow。 (3)扩展user 扩展user模型与自带的user使用外键进行关联,命名为profile。 二、英语总结(生…

记录---nextTick用过吗?讲一讲实现思路吧

🧑‍💻 写在开头 点赞 + 收藏 === 学会🤣🤣🤣源码实现思路(面试高分回答) 📖 面试官问我 Vue 的 nextTick 原理是怎么实现的,我这样回答: 在调用 this.$nextTick(cb) 之前:存在一个 callbacks 数组,用于存放所有的 cb 回调函数。 存在一个 flushCallbacks 函…

AI|经常崩溃的问题解决

Adobe Illustrator Crashes 网络上大部分说法都是重装AI,兼容性问题,管理员权限或者是版本不对,经测试均无效,甚至出现重装系统这种离谱的办法,正确的解决办法是把首选项的性能里的GPU取消勾选,或者再把电脑的虚拟内存扩大即可。Step1:打开首选项 Step 2:取消勾选GPU性…

吐槽ubuntu上pdf阅读器

! https://zhuanlan.zhihu.com/p/6483861108 细数(吐槽)ubuntu(linux)上pdf阅读器不好用的地方 作为一枚研究僧,有使用ubuntu(linux)的需求,同时也有在ubuntu上看学术文献的需求(毕竟有时候懒得切换回windows)。对于pdf学术文献阅读,最需要功能是高亮、点击跳转、(跳转后)返…

数据采集与融合技术作业4

Gitee作业链接:https://gitee.com/zheng-qijian33/crawl_project/tree/master/作业4 作业①: 要求: 熟练掌握 Selenium 查找HTML元素、爬取Ajax网页数据、等待HTML元素等内容。 使用Selenium框架+ MySQL数据库存储技术路线爬取“沪深A股”、“上证A股”、“深证A股”3个板块的…

书生共学大模型实战营第4期 L1G4000任务提交

基于LlamaIndex构建自己的RAG知识库,寻找一个问题A在使用LlamaIndex之前浦语API不会回答,借助LlamaIndex后浦语API具备回答A的能力 我们选择了一个名为wereader的Github小众项目,这是一个Chrome/Firefox扩展,主要用于微信读书做笔记,对常使用Markdown做笔记的读者比较有帮…

Springboot 集成Apollo配置中心【记录】

一、前言 ​ 我们经常会在Springboot项目中集成配置中心,无外乎是因为配置中心即时改即时生效的缘故。而我选择Apollo的原因,是因为它有个草稿、然后发布的功能,这在上生产发布前,提前配置好变更项,检查通过再发布,这种机制对于我们来说可太友好了!二、步骤 2.1 pom.xm…

JUC---ThreadLocal原理详解

什么是ThreadLocal? 通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。如果想实现每一个线程都有自己的专属本地变量该如何解决呢? JDK 中自带的ThreadLocal类正是为了解决这样的问题。 ThreadLocal类主要解决的就是让每个线程绑定自己的值,可以将ThreadLocal类…

一文讲透 FPGA CDC 多bit跨时钟域同步-hand-shanking机制

一、背景 数据的跨时钟域处理是FPGA开发过程中的常见问题,存在两种情况慢时钟向快时钟同步:只需在快时钟域打两拍即可。其RTL如下:打拍同步的原理:大家在初学FPGA时,经常听过FPGA中对信号打拍可以有效得避免亚稳态,而且一般要打两拍,其数学本质是如果打一拍发生错误得概…

KBPC3510-ASEMI整流桥KBPC3510参数、封装、尺寸

KBPC3510-ASEMI整流桥KBPC3510参数、封装、尺寸编辑:ll KBPC3510-ASEMI整流桥KBPC3510参数、封装、尺寸 型号:KBPC3510 品牌:ASEMI 封装:KBPC-4 正向电流:35A 反向电压:1000V 引脚数量:4 芯片个数:4 芯片尺寸:50MIL 漏电流:>10ua 恢复时间:>2000ns 浪涌电流:…

IDEA中操作表

Navicat中创建的表,同时也可以在IDEA中打开。 IDEA中侧边可以创建架构 可以选择相应排序规则以及创建新的表,但不如navicat方便