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$ 分。