【2026】简单 mex 问题的一些小巧思及解题方法
事实上,许多
:::info[Defination 1.]{open}
一般地,我们定义非负整数 / 自然数序列的
-
- 不存在
y \lt x ,满足y 也没有在序列中出现过。 :::
简而言之就是序列中最小的,没有出现过的自然数。
\textbf {Thoughts From Def.}
下述所有区间均与
不难发现这样的定义给了我们一些启发。首先可以注意到的是两个性质:
:::success[Property 1.]{open}
- 若一个非负整数序列的
\operatorname{mex} 为x (x \neq 0) ,那么[0, x-1] 中的所有整数必然在序列中出现过。 :::info[Proof 1.] 由定义中的 “定义 2” 可知。 :::
:::success[Property 2.]{open}
- 若一个非负整数序列
\operatorname{mex} 为x ,那么[0, x-1] 中的所有整数最后一次出现的位置必然在序列的若干位置中;x 最后一次出现的位置必然不在序列中存在。 :::info[Proof 2.] 由定义中的 “定义 1” 可知。 :::
:::success[Property 3.]{open}
- 一个长为
n 的非负整数序列的\operatorname{mex} \in \textbf {[0, n]} 。 :::info[Proof 3.] 这个下限是容易证明的,现在我们来简证上限为什么是n 。
我们考虑按位构造这样一个长为
下面我们通过一道例题来深入探究:P14936 「FAOI-R10」别样的 mex 大战 。
:::info[Solution & Thinking]{open} 对于这种添加数来满足条件的问题,我们可以有两种可鉴的思路:整体考虑,亦或是考虑加一项对前面的贡献。
整体考虑的思想难以连接起
- 若
a_{n+k} \neq \operatorname{mex}(a_{1..n+k-1}) ,那么异或值更新,\operatorname{mex} 不会更新,此时若假设n + k 项需要满足条件,可行的构造方法有下式推出:(\oplus_{i=1}^{n+k-1} a_i) \oplus a_{n+k} = \operatorname{mex}(a_{1..n+k-1}) \Rightarrow (\oplus_{i=1}^{n+k-1} a_i) \oplus a_{n+k} \oplus (\oplus_{i=1}^{n+k-1} a_i) = \operatorname{mex}(a_{1..n+k-1}) \oplus (\oplus_{i=1}^{n+k-1} a_i) \Rightarrow a_{n+k} = \operatorname{mex}(a_{1..n+k-1}) \oplus (\oplus_{i=1}^{n+k-1} a_i)
此时注意到需要满足
- 若
a_{n+k} = \operatorname{mex}(a_{1..n+k-1}) ,那么异或值更新,\operatorname{mex} 也更新,此时若假设n + k 项需要满足条件,可行的构造方法有下式推出:
在之后的构造中,不难发现总存在一个
这道例题颇有 Ad-hoc 的韵味。场上也许我们有时候没有时间思考详细的证明过程,但最后的结论是很好想到的。
下面我们再来一道比较难的 RMQ 例题:P4137 Rmq Problem / mex
:::info[Solution & Thinking]{open}
由前述的 “性质 2” 可知
于是我们以下标 - 元素最后出现位置建立一个二维平面坐标系,设元素
既然涉及到了二维平面的数据处理,可以考虑遍历下标,用主席树维护最后出现位置,时间复杂度
不难发现上述的三个性质已经足够我们得心应手地应对一部分相关简单题目,但这还远远不够。由于知识点复杂,连接性较强的题目层出不穷,于是或许我们需要在深入些。
\textbf {Extend for faraway.}
根据其与数据结构等地连接性,下面我们再依据这些算法和结构给出下述两个性质:
:::success[Property 4.]{open}
- 一般地,从一个长为
n 的非负整数序列a 截取一段可不连续子序列a' (长为l \le n ),设其\operatorname{mex} = k ,不能推得“存在一段本质不同的相同长度子序列,使得新子序列的\operatorname{mex} \le k 或\operatorname{mex} \ge k ”,也就是说\operatorname{mex} 在此种情况下不具有连续单调性。 :::info[Proof 4.] 这个是很容易理解的性质。两个相同长度但本质不同的子序列\operatorname{mex} 必然没有充分 / 必要条件的联系,除非题目给出某些特殊性质。 :::
:::success[Property 5.]{open}
一般地,对于长为
:::info[Proof 5.] 由于涉及到了三种运算,考虑分类讨论:
综上,原式在性质约束下恒成立。 :::
:::success[Property 6.]{open}
一般地,对于长为
简单来说,当连续子区间
-
若
a_{r+1} = \operatorname{mex}(a_{l..r}) ,因为不\exists y \lt \operatorname{mex}(a_{l..r}), \operatorname{s.t.} y 也没有在序列中出现过,又“性质 1”,故此时必然满足\operatorname{mex}(a_{l..{r+1}}) \gt \operatorname{mex}(a_{l..r}) 。 -
若
a_{r+1} \neq \operatorname{mex}(a_{l..r}) ,因为子区间的\operatorname{mex} 没有发生变化,故此时必然满足\operatorname{mex}(a_{l..{r+1}}) = \operatorname{mex}(a_{l..r}) 。
综上,
下面我们依照上述若干个性质给出两道例题:(SGT 分治)P5631 最小mex生成树,(二维偏序 / 矩形面积并)P10169 [DTCPC 2024] mex,min,max。
- 例 1: :::info[Solution & Thinking]{open} 由“性质 4”可以证明二分算法的不可行性。
接下来我们尝试考虑贪心。将边权从大到小排序,再类似 Kruskal 算法尝试构造生成树。这样的算法正确性看似确实无疑,但这里有一组构造出来的 hack 数据:
Input:
3 3
1 2 0
1 3 0
2 3 1
Answer: 1
Output: 2
即该无向图如下图所示:
按照贪心的算法的逻辑,它会连接 “
由于“性质 2”的存在,不妨让我们思考枚举可能的最终答案,把权值与遍历到的可能答案相等的边全部删去,考虑剩下的边是否可以构造出一颗任意生成树。又考虑到“性质 3”,可以得到答案至多只有
考虑优化。既然我们需要删边求生成树,考虑到任意两个不同遍历到的答案所构造的生成树中有大量的边重复,也就可以考虑在删边上着力优化,即让处理这些重复边所耗费的效率尽可能小。由此我们可以发现既然权值遍历具有先后顺序,那么这些边是不是也可以顺应遍历的顺序先后出现呢?
由此,我们可以发现每条边若权值是
本道题的思维推导树如下(由 DeepSeek R1 辅助生成):
本道题的伪代码如下(由 DeepSeek R1 辅助生成):
Algorithm Main:
Input: n, m, edges[]
Output: minimal mex value
// 找到最大边权 W
W ← 0
for each edge in edges do
W ← max(W, edge.w)
// 答案范围是 [0, W+1]
maxAns ← W + 1
// 构建线段树分治结构
segmentTree ← SegmentTree(0, maxAns)
// 将每条边分配到对应的时间区间
for each edge (u, v, w) in edges do
// 边在 ans ≠ w 的时刻都存在
// 即区间 [0, w) ∪ (w, maxAns]
if w > 0 then
segmentTree.insert(0, w-1, edge)
if w < maxAns then
segmentTree.insert(w+1, maxAns, edge)
// 初始化可撤销并查集
dsu ← DSU(n)
// 深度优先遍历线段树
result ← DFS(segmentTree.root, dsu)
return result
Function DFS(node, dsu):
// 记录当前状态快照
snapshot ← dsu.saveState()
// 加入当前节点管理的边
for each edge in node.edges do
dsu.unite(edge.u, edge.v)
// 检查叶子节点(即单个ans值)
if node.isLeaf then
ansValue ← node.rangeStart
if dsu.isConnected() then
// 能够形成生成树,记录这个ans是可行的
result ← ansValue
else
result ← INF
else
// 递归处理子节点
leftResult ← DFS(node.left, dsu)
rightResult ← DFS(node.right, dsu)
result ← min(leftResult, rightResult)
// 回溯:撤销当前节点的操作
dsu.rollback(snapshot)
return result
:::
- 例 2:
::::info[Solution & Thinking]{open} 由“性质 5”可得
于是原式转化成求
的区间个数。下面略去
- 若
\begin{cases} \min \ge \operatorname{mex}\\ \min + k \ge \max \end{cases} ,则原式整理为:
这是好求解的,上式的含义即为子区间极差不超过常数
设
设产生贡献的区间为
:::warning[注意题设条件]
由于
- 若
\begin{cases} \operatorname{mex} \ge \min\\ \operatorname{mex} + k \ge \max \end{cases} ,则原式整理为:
或者
要求不等式区间统计的方法,主要是为整体单调性和单个运算单调性,在这里首要分析整体单调性。类似于情况 1 的讨论,设
设产生贡献的区间为
接下来我们考虑单一运算单调性,即
所以留给我们的只有固定
综上,该问题的解决时间复杂度为
本道题的思维推导树如下(由 DeepSeek R1 辅助生成): ::::
至上述这六个性质已经足够我们完成大部分
- 一些关于
\operatorname{mex} 的练习题:- 练 1:P11638 Max,Mex (提示:考虑
\operatorname{mex} 的定义,及作用序列定义域) - 练 2:CF1083C Max Mex (提示:考虑答案的枚举是否可以转化使其具有单调性)
- 练 3:CF1834E MEX of LCM
- 练 1:P11638 Max,Mex (提示:考虑