CF2259D MEX Multiset
题目描述
给定一个数组 $a_1, a_2, \ldots, a_n$。现在有 $3$ 个初始为空的多重集 $A, B, C$,对于每个下标 $i$($1 \leq i \leq n$),你需要将 $a_i$ 放入 $A$、$B$ 或 $C$ 中的恰好一个。
请判断是否存在一种将所有元素分配到多重集的方案,使得 $\operatorname{MEX}(A) + \operatorname{MEX}(B) + \operatorname{MEX}(C) \geq 2 \cdot \max(\operatorname{MEX}(A), \operatorname{MEX}(B), \operatorname{MEX}(C))^\ast$。如果可行,请输出一种分配方案。
$^\ast\ \operatorname{MEX}(D)$ 定义为集合 $D$ 中未出现的最小非负整数。例如,$\operatorname{MEX}([1, 2, 0, 5]) = 3$,$\operatorname{MEX}([1, 2, 4, 9]) = 0$。空集合的 $\operatorname{MEX}$ 为 $0$。
输入格式
输入的第一行包含一个整数 $t$($1 \leq t \leq 10^4$),表示测试用例个数。
每个测试用例的第一行包含一个整数 $n$($3 \leq n \leq 2 \cdot 10^5$),表示数组 $a$ 的长度。
每个测试用例的第二行包含 $a_1, a_2, \ldots, a_n$($0 \leq a_i \leq 10^9$),表示数组 $a$。
保证所有测试用例中 $n$ 的总和不超过 $2 \cdot 10^5$。
输出格式
如果存在一种有效的元素划分方案,将每个元素分配到多重集使得条件成立,输出 $\texttt{YES}$。否则输出 $\texttt{NO}$。
如果答案是 $\texttt{YES}$,则在新的一行输出一个长度为 $n$ 的字符串 $s$,其中 $s_i = \texttt{A}$ 表示第 $i$ 个元素放入 $A$,$s_i = \texttt{B}$ 表示放入 $B$,$s_i = \texttt{C}$ 表示放入 $C$。
你可以用任意大小写输出答案。例如,字符串 $\texttt{YES}$、$\texttt{yes}$、$\texttt{yEs}$、$\texttt{Yes}$ 都被视为正解,$\texttt{NO}$、$\texttt{no}$、$\texttt{No}$ 视为负解。同时,$\texttt{AABCAAA}$、$\texttt{aabcaaa}$、$\texttt{aaBcaaa}$ 被视为相同答案。
如果存在多种方案,输出任意一种即可。
说明/提示
在第一个测试用例中,可以分配为 $A = \{0, 1, 1\}$,$B = \{0, 1\}$,$C = \{2\}$,这样 $\operatorname{MEX}(A) + \operatorname{MEX}(B) + \operatorname{MEX}(C) = 4$,$2 \cdot \max(\operatorname{MEX}(A), \operatorname{MEX}(B), \operatorname{MEX}(C)) = 2 \cdot \max(2, 2, 0) = 4$。
在第三个测试用例中,可以证明不存在一个有效的分配方案。
由 ChatGPT 5 翻译