P14066 [PO Final 2022] 分组 / Triangeltal
题目描述
在一所班级里有 $N$ 名学生,现在到了必须进行的演讲环节。大多数学生都非常期待演讲,恨不得立刻轮到自己。但在此之前,需要先把他们分成 3 个小组。随后,组 1 的所有人会向组 2 演讲,组 2 向组 3 演讲,组 3 向组 1 演讲。
让分组变得复杂的是,学生的追求程度不同。每位学生 $i$ 要求自己至少要在 $A_i$ 位听众面前演讲,其中 $A_i$ 为正整数。举例而言,如果学生 $i$ 被分到组 1,那么为了让学生 $i$ 满意,组 2 必须至少有 $A_i$ 名成员。这个要求对三组按循环关系成立:
* 若学生 $i$ 在第 1 组,则第 2 组的人数至少为 $A_i$。
* 若学生 $i$ 在第 2 组,则第 3 组的人数至少为 $A_i$。
* 若学生 $i$ 在第 3 组,则第 1 组的人数至少为 $A_i$。
给定这 $N$ 个数 $A_i$,你的任务是判断是否存在一种把学生分成三组的方法,使得所有学生都满意;如果存在,请找出一种合法的分组。
输入格式
第一行包含一个整数 $N$($3 \le N \le 5 \cdot 10^5$)。
第二行包含 $N$ 个整数 $A_i$($1 \le A_i \le N$)。
输出格式
如果不存在合法分组,输出仅包含字符串 $\texttt{NO}$ 的一行。
如果存在合法分组,先输出一行字符串 $\texttt{YES}$。随后输出一行字符串 $S$,它由字符 1、2 和 3 组成。字符串中第 $i$ 个位置的字符表示学生 $i$ 被分到了哪一组。如果有多种解,输出任意一种均可。
说明/提示
### 子任务
**本题采用捆绑测试。**
| 子任务编号 | 得分 | 限制 |
|:-:|:-:|---|
| $1$ | $14$ | $A_1 = A_2 = \dots = A_N$ |
| $2$ | $16$ | $N \le 10$ |
| $3$ | $11$ | $A_i \le 3$ |
| $3$ | $23$ | $N \le 3000$ |
| $4$ | $36$ | 无额外限制 |