问题描述: 蒜头君有一个长度为 n 的序列 a1,a2,⋯,an,现在他有 m 个问题要问你,每次给你一对 1≤l≤r≤n ,求 al,a(l+1),⋯,ar 的 mex 的值。 mex 的值定义为该序列中最小未出现过的自然数。 数据范围: 1≤n,m≤10^5 al,a(l+1),⋯,ar 为 0∼n−1 的一个排列。 输入格式: 第一行两个整数 n, m 第二行 n 个整数,表示 a1,a2,⋯,an 接下来 m 行,每行两个整数,分别对应每次询问的 l 和 r 输出格式: 对于每一次询问,输出一行一个整数,表示对应的 mex 值。 这道题目是一个区间 mex 的问题。我们可以用线段树来解决。 基本思路是: 对于线段树的每个节点,维护一个桶,桶的下标为0 ~ n-1的整数,表示这个整数在当前区间中出现过的次数。 每次进行区间查询,我们遍历这个区间,找到第一个桶中值为0的整数,即为mex值. 该算法的时间复杂度为O(nlog(n)) C++代码
时间: 2023-02-08 11:06:51 浏览: 255
这道题目需要我们求区间 mex 值,即区间中最小未出现过的自然数。我们可以使用线段树来解决这个问题。
思路如下:
- 首先建立线段树,对于每个节点维护一个桶,桶的下标为0 ~ n-1的整数,表示这个整数在当前区间中出现过的次数。
- 对于区间查询,遍历这个区间,找到第一个桶中值为0的整数,即为mex值。
这种算法的时间复杂度为O(nlog(n))。C语言实现代码可以参考给出的代码。
阅读全文