AT_agc076_b [AGC076B] Split and Reverse
题目描述
给定一个长度为 $N$ 的整数序列 $X = (X_1, X_2, \cdots, X_N)$,其中每个元素均为 $0$ 或 $1$。
你可以执行以下操作任意次(包括零次):
- 将 $X$ 的每个元素划分到组 `A` 或组 `B`。对每一组,将其包含的元素整体翻转顺序。更正式地说,若某组包含的元素为 $X_{i_1}, X_{i_2}, \cdots, X_{i_s}$($i_1 < i_2 < \cdots < i_s$),则对所有 $1 \leq j \leq s$,同时将 $X_{i_j}$ 替换为 $X_{i_{s+1-j}}$。
你的目标是将 $X$ 变为非递减序列。请找出达到该目标所需的最少操作次数以及具体的操作方式。在本题的限制下,可以保证一定存在解。
对于一组输入,请解决 $T$ 个测试用例。
输入格式
输入通过标准输入给出,格式如下:
> $T$ $case_1$ $case_2$ $\vdots$ $case_T$
每个测试用例如下格式:
> $N$ $X_1$ $X_2$ $\cdots$ $X_N$
输出格式
对于每个测试用例,输出如下格式:
> $k$ $s_1$ $s_2$ $\vdots$ $s_k$
其中,$k$ 表示所需的最少操作次数,$s_i$ 是表示第 $i$ 次操作的字符串。$s_i$ 是由 `A` 和 `B` 组成的长度为 $N$ 的字符串,第 $j$ 个字符表示本次操作中 $X_j$ 分到哪个组。如果有多组解,输出任意一种都可以。
说明/提示
### 样例解释 1
对于第一个测试用例,可以通过如下两步达到目标,这也是最少的操作次数:
- 第一步操作:使用 $s_1=$`AABA`。由于 $(X_1, X_2, X_4)$ 被分入组 `A`,翻转其顺序后得到 $(X_1, X_2, X_4) = (1, 1, 0)$。而 $(X_3)$ 被分入组 `B`,翻转后还是 $(0)$。因此总体得到 $X = (1, 1, 0, 0)$。
- 第二步操作:使用 $s_2=$`BBBB`。此时组 `A` 为空,翻转无影响。$(X_1, X_2, X_3, X_4)$ 全部分到组 `B`,翻转后序列变为 $(0, 0, 1, 1)$,因此 $X = (0, 0, 1, 1)$。
对于第二个测试用例,可以不进行任何操作。
### 约束条件
- $1 \leq T \leq 250000$
- $1 \leq N \leq 250000$
- $0 \leq X_i \leq 1$
- 所有 $T$ 个测试用例的 $N$ 之和不超过 $250000$。
- 所有输入值均为整数。
由 ChatGPT 5 翻译