P11710 「KTSC 2020 R2」一二三

题目背景

**请使用 C++17 或 C++20 提交本题** 你需要在程序开头加入如下代码: ```cpp #include void maximize(std::vector A); void answer(int i, int j, int k); ``` 题目译自 [2020년도 국제정보올림피아드 대표학생 선발고사 - 2차 선발고사](https://www.ioikorea.kr/archives/ioitst/2020/) T2「 [하나 둘 셋](https://assets.ioikorea.kr/ioitst/2020/1/onetwothree/onetwothree_statement.pdf)」

题目描述

有一个长度为 $N$ 的数组 $A$,这个数组只包含数字 $1$、$2$ 和 $3$。我们需要在这个数组中找到尽可能多的满足以下条件的三元组 $(i, j, k)$: 对于数组中的三个索引 $i, j, k \quad(0 \leq i < j < k < N)$,要么 $A[i]=1, A[j]=2, A[k]=3$,要么 $A[i]=3, A[j]=2, A[k]=1$。并且,每个索引最多只能出现在一个三元组中。 例如,给定 $A=\{1,2,3,2,3,1\}$,满足条件的三元组是 $(0,1,4)$ 和 $(2,3,5)$。$(A[0]=1, A[1]=2, A[4]=3)$ 和 $(A[2]=3, A[3]=2, A[5]=1)$。 编写一个程序,在给定数组 $A$ 的情况下,找到尽可能多的满足条件的三元组 $(i, j, k)$。 你需要实现以下函数: `void maximize(vector A);` - 参数 `A` 是一个长度为 `N` 的 `vector`,只包含数字 $1$、$2$ 和 $3$。函数 `maximize` 需要在数组 `A` 中找到尽可能多的满足条件的三元组 $(i, j, k)$,并且对于找到的每个三元组 $(i, j, k)$,调用 `grader` 的 `answer(int i, int j, int k)` 函数一次。如果有多种方法找到最大数量的三元组,可以任选一种。三元组的调用顺序无关紧要。例如,对于问题中的示例,可以先调用 `answer(0,1,4)`,再调用 `answer(2,3,5)`,也可以先调用 `answer(2,3,5)`,再调用 `answer(0,1,4)`。

输入格式

评测程序按以下格式读取输入: - 第 $1$ 行:$N$ - 第 $2$ 行:$N$ 个整数,每个整数为 $1$、$2$ 或 $3$

输出格式

评测程序将首先输出 `maximize` 函数调用 `answer(i, j, k)` 函数的次数,然后对于每次 `answer(i, j, k)` 调用,输出 $i, j, k$ 的值。

说明/提示

### 样例说明 #1 以下是样例中函数调用及其结果的顺序: | 函数调用 | 返回值 | | :----------: | :----------: | |`maximize({1, 2, 3, 2, 3, 1})`|`2`| |`answer(0,1,4)`|`0 1 4`| |`answer(2,3,5)`|`2 3 5`| ### 数据范围 对于所有输入数据,满足: - $3 \leq N \leq 15,000$ 详细子任务附加限制及分值如下表所示。 | Subtask | 分值 | 约束 | | :----------: | :----------: | :----------: | |$1$|$14$|$N \leq 18$| |$2$|$29$|$N \leq 100$| |$3$|$53$|$N \leq 3,000$| |$4$|$54$|无附加限制| 本题满分为 $150$ 分。