#P12505. 「CEOI2025」等于 mex

「CEOI2025」等于 mex

注意事项

请在提交源代码前添加 #include "equalmex.h"

题目描述

在罗马尼亚贵族中众所周知,一个整数数组 a[0],a[1],a[2],,a[m1]a[0], a[1], a[2], \ldots, a[m-1] 的美感是正整数 kk 的数量,对于这些 kk,你可以将数组分成 kk 个不相交的子数组(连续元素的序列),使得每个元素恰好包含在一个子数组中,并且所有子数组具有相同的最小排除元素。整数数组的最小排除元素是不出现在数组中的最小严格正整数(大于 00)。

给你一个整数数组 v[0],v[1],,v[n1]v[0], v[1], \ldots, v[n-1]qq 个查询,形式为 (li,ri)(l_{i}, r_{i}),其中对于所有 0i<q0 \leq i < q0liri<n0 \leq l_{i} \leq r_{i} < n

对于每个查询,你需要找到数组 v[li],v[li+1],,v[ri]v[l_{i}], v[l_{i}+1], \ldots, v[r_{i}] 的美感。

实现细节

你应该实现以下程序:

std::vector<int> solve(
    int n, std::vector<int>& v,
    int q, std::vector<std::pair<int, int>>& queries);
  • nn:整数数组的大小
  • vv:长度为 nn 的数组,初始数组
  • qq:查询数量
  • queriesqueries:长度为 qq 的数组,描述查询
  • 该程序应返回一个长度为 qq 的整数向量,包含每个查询的答案。
  • 对于每个测试点,该程序只被调用一次。

示例评测程序

示例评测程序读取以下格式的输入:

  • 11 行:n qn\ q
  • 22 行:v[0] v[1]  v[n1]v[0]\ v[1]\ \ldots\ v[n-1]
  • 3+i3+i 行:li ril_{i}\ r_{i} 对于所有 0i<q0 \leq i < q

并输出 qq 行,调用函数 solve 的结果,使用相应的参数。

样例 1

考虑以下调用:

solve(10, {1, 1, 2, 2, 3, 3, 1, 2, 3, 4}, 2, {{0, 5}, {0, 8}})

在这个样例中,n=10n=10,有 22 个查询,其中:

  • l0=0l_{0}=0r0=5r_{0}=5
  • l1=0l_{1}=0r1=8r_{1}=8

对于第一个查询,我们只能将区间分成一个子数组,从位置 00 到位置 55

对于第二个查询,kk 可以是 1122

将区间分成 11 个子数组的一种可能是选择从位置 00 到位置 88 的子数组。 将区间分成 22 个子数组的一种可能是选择从位置 00 到位置 55 和从位置 66 到位置 88 的子数组。

第一个查询的答案是 11,第二个查询的答案是 22,因此调用 solve 将返回 {1,2}\{1, 2\}

数据范围与提示

对于所有输入数据,满足:

  • 1n6000001 \leq n \leq 600000
  • 1q6000001 \leq q \leq 600000
  • 对于所有 0i<n0 \leq i < n1v[i]4000001 \leq v[i] \leq 400000
  • 对于所有 0i<q0 \leq i < q0liri<n0 \leq l_{i} \leq r_{i} < n

详细子任务附加限制及分值如下表所示。

子任务 分值 附加限制
11 44 1n10,1q1001 \leq n \leq 10, 1 \leq q \leq 100
22 66 1n,q1001 \leq n, q \leq 100
33 1717 1n,q10001 \leq n, q \leq 1000
44 1010 1n,q1000001 \leq n, q \leq 100000 且对于所有 0i<n0 \leq i < n1v[i]21 \leq v[i] \leq 2
55 3030 1n,q750001 \leq n, q \leq 75000
66 3333 无附加限制