[10月考试] F

[10月考试] F

题目描述

给定长度为 nnn 的序列 ana_nan,保证 aia_iai 为非负整数。

mmm 次询问,每次给定区间 l,rl,rl,r,求出 al,al+1,…,ara_l,a_{l+1},\ldots,a_ral,al+1,,armexmexmex

对于一个序列,定义其 mexmexmex 为不在序列中出现的最小非负整数。

例如序列 1,2,5,71,2,5,71,2,5,7mexmexmex000,序列 3,0,1,2,53,0,1,2,53,0,1,2,5mexmexmex444

对于所有数据,n,m≤1000n,m\leq 1000n,m10001≤l≤r≤n1\leq l\leq r\leq n1lrn0≤ai≤10000\leq a_i\leq 10000ai1000

输入格式

输入共 m+2m+2m+2 行。

111 行输入 222 个正整数 n,mn,mn,m

222 行输入 nnn 个非负整数 a1,a2,…,ana_1,a_2,\ldots,a_na1,a2,,an

接下来 mmm 行,每行输入 222 个正整数 l,rl,rl,r 代表一次询问。

输出格式

输出共 mmm 行,每行输出 111 个非负整数,代表一次询问的答案。

样例 #1

样例输入 #1

5 3
1 3 2 0 4
1 5
2 4
1 3

样例输出 #1

5
1
0

提示

对于 30%30\%30% 的数据,n,m≤5n,m\leq 5n,m5

对于 60%60\%60% 的数据,n,m≤100n,m\leq 100n,m100ai≤5a_i\leq 5ai5

对于所有数据,n,m≤1000n,m\leq 1000n,m10001≤l≤r≤n1\leq l\leq r\leq n1lrn0≤ai≤10000\leq a_i\leq 10000ai1000

题目解析

这道题要求我们对给定序列区间 [l, r] 求其 mex(即不在该区间内的最小非负整数)。mex 是序列中不包含的最小整数。例如,给定一个序列 1, 2, 3, 4,其 mex0,因为 0 是最小的且不在这个序列中。

解题思路

  1. 暴力解法

    • 对每一个查询区间 [l, r],我们可以直接扫描区间 [l, r],找到其中所有的数,记录这些数。
    • 然后从 0 开始,找到最小的一个没有出现在区间内的数,返回这个数作为 mex

    由于题目中的 nm 最大为 1000,所以暴力方法的时间复杂度是 O(n * m),每次查询的时间复杂度是 O(n)。最坏情况下,总时间复杂度为 O(n * m),在最坏情况下(n = 1000, m = 1000)是可以接受的。

具体实现

  1. 读取输入数据

  2. 处理每个查询,对于每个查询区间 [l, r],我们:

    • 利用一个数组 count 来记录区间中各个数值的出现情况。

    • 找到最小的非负整数 mex,它不在区间内出现。

#include
#include
#include
using namespace std;

int main() {
int n, m;
cin >> n >> m;

vector<int> a(n);
for (int i = 0; i < n; i++) {cin >> a[i];
}// 处理每次查询
for (int i = 0; i < m; i++) {int l, r;cin >> l >> r;l--; r--;  // 转换为0-index// 用一个set来记录区间内的所有数set<int> nums_in_range;for (int j = l; j <= r; j++) {nums_in_range.insert(a[j]);}// 找到mexint mex = 0;while (nums_in_range.count(mex)) {mex++;}cout << mex << endl;
}return 0;
}

代码解析

  1. 输入处理
    • 首先读取 nm
    • 然后读取长度为 n 的序列 a
  2. 查询处理
    • 对于每个查询区间 [l, r],我们通过 set<int> nums_in_range 来记录该区间中所有不同的元素。
    • 通过遍历区间 [l, r],将区间中的所有数插入到 nums_in_range 中(set 会自动去重)。
  3. 计算 mex
    • 0 开始查找最小的没有出现的数,即 mex。我们使用 count 方法来检查 mex 是否出现在 set 中,直到找到一个不在其中的 mex
  4. 输出结果
    • 对于每次查询,输出对应的 mex 值。

时间复杂度

  • 对于每个查询,扫描区间的时间复杂度是 O(r - l + 1),而构建 set 的时间复杂度是 O(r - l + 1)
  • 查找 mex 的时间复杂度是 O(mex),但是 mex 最大也不会超过区间中最大数值 + 1,所以它的时间复杂度是 O(n)(理论上最多为 n)。
  • 因此,每个查询的时间复杂度为 O(n),总时间复杂度为 O(n * m),这是可以接受的。

简单算法思路

  1. 遍历查询区间:对于每一个查询,我们需要遍历区间 [l, r],将该区间内的所有数保存到一个集合中。
  2. 计算 mexmex 是从 0 开始,找到最小的一个不在集合中的数。

优化:直接使用一个数组来记录该区间内数字的出现情况,而不使用 set

#include
#include
using namespace std;

int main() {
int n, m;
cin >> n >> m;

vector<int> a(n);
for (int i = 0; i < n; i++) {cin >> a[i];
}// 处理每次查询
for (int i = 0; i < m; i++) {int l, r;cin >> l >> r;l--; r--;  // 转换为0-index// 用一个数组记录区间内的数是否出现过bool appeared[1001] = {false};// 标记区间内的数for (int j = l; j <= r; j++) {appeared[a[j]] = true;}// 找到最小的没出现的数即为mexint mex = 0;while (appeared[mex]) {mex++;}cout << mex << endl;
}return 0;
}

代码解析

  1. 输入处理
    • 首先读取 nm
    • 然后读取长度为 n 的序列 a
  2. 查询处理
    • 对于每个查询区间 [l, r],我们创建一个布尔数组 appeared,该数组用于标记区间内出现的数字。数组大小为 1001,涵盖了所有可能出现的数字(0 到 1000)。
  3. 计算 mex
    • 对于每个区间 [l, r],我们将区间内的每个数对应的 appeared 数组位置标记为 true
    • 然后从 0 开始,查找最小的没有被标记为 true 的数字,那个数字就是 mex
  4. 输出结果
    • 对于每次查询,输出对应的 mex 值。

时间复杂度分析

  • 对于每个查询,我们需要扫描区间 [l, r],这需要 O(r - l + 1) 的时间。最大时,区间长度为 n
  • 对于每个查询,我们还需要检查 appeared 数组的 mex 值,最多需要检查 1001 个位置,时间复杂度是 O(1001),即常数时间。
  • 所以每个查询的时间复杂度为 O(n),总时间复杂度为 O(n * m)

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

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

相关文章

收集了全球55个AI写作工具

我们即将推出一整套AI生产力工具矩阵&#xff0c;覆盖内容创作&#xff08;AI写作助手&#xff09;、视觉设计&#xff08;智能图像处理&#xff09;、音视频制作&#xff08;自动转录与编辑&#xff09;及智能编程等多个核心领域。这些解决方案通过先进的机器学习算法&#xf…

Elastic 劳动力的生成式 AI:ElasticGPT 的幕后解析

作者&#xff1a;来自 Elastic Jay Shah, Adhish Thite ElasticGPT — 由 Elastic 提供支持&#xff0c;专为 Elastic 打造 ElasticGPT 是我们基于检索增强生成&#xff08;RAG&#xff09;框架构建的内部生成式 AI &#xff08;GenAI&#xff09;助手。它是使用 Elastic 自有…

CS231n-2017 Assignment1

KNN&#xff1a;这里要求我们完成一个KNN分类器&#xff0c;实现对图片使用KNN算法进行分类标签k_nearest_neighbor.py这里要求我们完成4个接口# X:测试集 # 使用两个循环 def compute_distances_two_loops(self, X):num_test X.shape[0]num_train self.X_train.shape[0]dist…

[python][flask]Flask-Principal 使用详解

Flask-Principal 是一个专为 Flask 应用设计的身份管理和权限控制扩展。它能够帮助开发者轻松实现用户身份验证和权限管理&#xff0c;从而提升应用的安全性和用户体验。该项目最初由 Ali Afshar 开发&#xff0c;现已成为 Pallets 社区生态系统的一部分&#xff0c;由社区共同…

抖音与B站爬虫实战,获取核心数据

本文将深入讲解两大主流短视频平台&#xff08;抖音、B站&#xff09;的爬虫实战技术&#xff0c;提供可直接运行的代码解决方案&#xff0c;并分享突破反爬机制的核心技巧。一、平台特性与爬虫难点对比平台数据价值主要反爬措施推荐抓取方式抖音视频数据、用户画像、热榜签名验…

WSL切换网络模式

WSL切换网络模式问题WSL从NAT改成MIRRORED找到WSL Setting修改配置重启电脑&#xff08;注意不是重启WSL&#xff09;运行pio run验证IP问题 从鱼香ROS买了一个小鱼车&#xff0c;开始学习&#xff0c;然而装环境都要搞死我了。 垃圾VirtualBox我新买的电脑&#xff0c;装个Vi…

[Linux入门] Linux 远程访问及控制全解析:从入门到实战

目录 一、SSH 远程管理&#xff1a;为什么它是远程访问的首选&#xff1f; 1️⃣什么是 SSH&#xff1f; 2️⃣SSH 为什么比传统工具更安全&#xff1f; 3️⃣SSH 的 “三大组成部分” 4️⃣SSH 工作的 “五步流程” 5️⃣常用 SSH 工具 二、实战&#xff1a;构建 SSH 远…

n8n AI资讯聚合与分发自动化教程:从数据获取到微信与Notion集成

引言 n8n简介&#xff1a;自动化工作流利器 n8n是一款功能强大的开源自动化工具&#xff0c;采用独特的“公平代码”&#xff08;Fair-Code&#xff09;许可模式&#xff0c;旨在帮助用户连接各种应用程序和服务&#xff0c;从而实现工作流的自动化。它通过直观的可视化界面&am…

递归查询美国加速-技术演进与行业应用深度解析

在当今数据驱动的时代&#xff0c;递归查询已成为处理层级数据的核心技术&#xff0c;尤其在美国科技领域获得广泛应用。本文将深入解析递归查询在美国加速发展的关键因素&#xff0c;包括技术演进、行业应用场景以及性能优化策略&#xff0c;帮助读者全面理解这一重要技术趋势…

【AIGC专栏】WebUI实现图片的缩放

图片的缩放包含如下的各类不同的缩放模型。 Lanczos Lanczos重采样是一种数学上精确的方法,用于图像放大或缩小。它使用了一种称为 sinc 函数的数学公式,可以在保留图像细节的同时减少锯齿效应。 Nearest 最近邻插值是一种简单的图像放大方法,通过复制最近的像素值来填充新…

Libevent(4)之使用教程(3)配置

Libevent(4)之使用教程(3)配置事件 Author: Once Day Date: 2025年7月27日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 本文档翻译于&#xff1a;Fast portable non-bl…

若依前后端分离版学习笔记(三)——表结构介绍

前言&#xff1a; 这一节将ruoyi框架中数据库中的表结构过一遍&#xff0c;查看都有哪些表及其表结构及关联关系&#xff0c;为后续代码学习做准备。 一 代码生成表记录代码生成的业务表及相关字段1 代码生成业务表 CREATE TABLE gen_table (table_id bigint(20) NOT NULL AUTO…

NFS服务安装与使用

概述 内网需要使用NFS服务挂载到其他服务器&#xff0c;用做数据备份使用。 安装 # Centos yum install -y nfs-utils # Ubuntu apt install nfs-common配置 # 编辑 vim /etc/exports # 输入内容 /public/KOL-ESbackup 172.29.1.0/24 192.168.8.63 192.168.8.64 192.168.8.65(r…

使用adb 发送广播 动态改变app内的值

前言 在开发过程中有时候我们需要做一些调试工作。可以通过adb发送广播实现。 广播注册 注意最后一个参数&#xff0c;Context.RECEIVER_EXPORTED 这是Android 34以后强制要求的&#xff0c;方便外部发送这个广播。否则会报错val filter IntentFilter()filter.addAction("…

【Web安全】逻辑漏洞之URL跳转漏洞:原理、场景与防御

文章目录前言一、漏洞本质二、攻击原理正常跳转流程漏洞触发流程三、抓包的关键时机&#xff1a;跳转参数生成时四、风险场景1.登录/注册后跳转2.退出登录跳转3.分享/广告链接跳转4.密码重置链接跳转五、漏洞挖掘&#xff1a;怎么找到这种漏洞&#xff1f;1.找到跳转参数2.篡改…

新手开发 App,容易陷入哪些误区?

新手开发 App 时&#xff0c;常因对流程和用户需求理解不足陷入误区&#xff0c;不仅拖慢进度&#xff0c;还可能导致产品无人问津。​功能堆砌是最常见的陷阱。不少新手总想 “一步到位”&#xff0c;在初期版本就加入十几项功能&#xff0c;比如做社区团购 App 时&#xff0c…

Linux学习篇11——Linux软件包管理利器:RPM与YUM详解与实战指南,包含如何配置失效的YUM镜像地址

引言 本文主要梳理 Linux 系统中的软件包的概念&#xff0c;同时介绍RPM与YUM两大核心管理工具的常用指令、区别联系以及实战技巧等。本文作为作者学习Linux系统的第11篇文章&#xff0c;依旧旨在总结当前的学习内容&#xff0c;同时巩固知识以便日后的学习复习回顾。如有说的…

Vue3+ElementPlus实现可拖拽/吸附/搜索/收起展开的浮动菜单组件

在开发后台管理系统时&#xff0c;我们经常会用到浮动菜单来快速访问某些功能。本篇文章将分享一个基于 Vue3 ElementPlus 实现的浮动菜单组件&#xff0c;支持拖拽移动、边缘吸附、二级菜单展开、菜单搜索过滤、视频弹窗等交互效果&#xff0c;极大提升了用户操作的便捷性与美…

CSS 盒子模型学习版的理解

文章目录一、盒子模型构建流程&#xff08;一句话抓关键&#xff09;二、核心逻辑提炼三、代码验证四、一句话总结流程通过手绘图示&#xff0c;清晰拆解 Content&#xff08;内容&#xff09;→ Padding&#xff08;内边距&#xff09;→ Border&#xff08;边框&#xff09;→…

解决线程安全的几个方法

线程安全&#xff1a;线程安全问题的发现与解决-CSDN博客 Java中所使用的并发机制依赖于JVM的实现和CPU的指令。 所以了解并掌握深入Java并发编程基础的前提知识是熟悉JVM的实现了解CPU的指令。 1.volatile简介 在多线程并发编程中&#xff0c;有两个重要的关键字&#xff1a…