JOI-kun 是一位制作团子(日本糯米团子)的专业糕点师。在 JOI-kun 的店里,团子的颜色是有规定的。团子共有 $N$ 种颜色,编号为 $1$ 到 $N$。
“精美团子串”是 JOI-kun 店里的招牌商品。一串精美团子串由 $N$ 个不同颜色的团子串在竹签上组成。
对于每种颜色,JOI-kun 都有 $M$ 个该颜色的团子。因此,JOI-kun 总共有 $N \times M$ 个团子。这些团子的编号为 $1$ 到 $N \times M$。利用这些团子和 $M$ 根竹签,JOI-kun 想要制作 $M$ 串精美团子串。
为了避免团子颜色出错,JOI-kun 将使用一个团子检测器。如果 JOI-kun 输入一些团子的编号,团子检测器会回答使用输入中的团子和足够多的竹签所能制作出的精美团子串的最大数量。
JOI-kun 希望通过多次使用团子检测器,将 $N \times M$ 个团子分成 $M$ 组。每一组都应包含 $N$ 个团子,且包含每种颜色各一个。
JOI-kun 希望在最多使用 $50\,000$ 次团子检测器的情况下,将 $N \times M$ 个团子分成 $M$ 组。
请编写一个程序,在给定团子信息的情况下,实现 JOI-kun 的策略,即在最多使用 $50\,000$ 次团子检测器的情况下将团子分组。
实现细节
你需要提交一个文件,文件名为 dango3.cpp。该程序应实现以下函数,并使用预处理指令 #include 包含 dango3.h。
void Solve(int N, int M)该函数对每个测试用例调用一次。- 参数 $N$ 是团子的颜色数量。
- 参数 $M$ 是 JOI-kun 想要制作的精美团子串数量。
你的程序可以调用以下函数:
int Query(const std::vector<int> &x)使用此函数,你的程序可以向团子检测器提问。- 参数 $x$ 是发送给团子检测器的团子编号列表。
- 返回值是使用参数 $x$ 指定的团子和足够多的竹签所能制作出的精美团子串的最大数量。
- 参数 $x$ 的每个元素都应在 $1$ 到 $N \times M$ 之间(含边界)。如果不满足此条件,你的程序将被判为 Wrong Answer [1]。
- 参数 $x$ 的元素应互不相同。如果不满足此条件,你的程序将被判为 Wrong Answer [2]。
- 调用
Query函数的次数不得超过 $50\,000$ 次。如果调用次数超过 $50\,000$ 次,你的程序将被判为 Wrong Answer [3]。
void Answer(const std::vector<int> &a)使用此函数,你的程序可以回答用于制作精美团子串的团子分组。- 参数 $a$ 是用于一串精美团子串的团子编号列表。
- 参数 $a$ 的长度应为 $N$。如果不满足此条件,你的程序将被判为 Wrong Answer [4]。
- 参数 $a$ 的每个元素都应在 $1$ 到 $N \times M$ 之间(含边界)。如果不满足此条件,你的程序将被判为 Wrong Answer [5]。
- 在整个过程中,任何编号不得出现超过一次。如果不满足此条件,你的程序将被判为 Wrong Answer [6]。
- 如果无法使用 $a$ 指定的团子和一根竹签制作出精美团子串,你的程序将被判为 Wrong Answer [7]。
Answer函数必须被调用恰好 $M$ 次。如果Solve函数终止时调用Answer的次数不等于 $M$,你的程序将被判为 Wrong Answer [8]。
重要提示
- 你的程序可以实现其他内部函数,或使用全局变量。
- 你的程序不得使用标准输入和标准输出。你的程序不得以任何方式与其他文件通信。但是,你的程序可以将调试信息输出到标准错误。
编译与测试
你可以从比赛网页下载包含样例评测器的压缩包来测试你的程序。样例评测器文件为 grader.cpp。为了测试你的程序,请将 grader.cpp、dango3.cpp 和 dango3.h 放在同一目录下,并运行以下命令来编译你的程序:
g++ -std=gnu++17 -O2 -o grader grader.cpp dango3.cpp
编译成功后,将生成可执行文件 grader。
请注意,实际的评测器与样例评测器不同。样例评测器将作为一个单一进程执行,它会从标准输入读取输入数据并将结果写入标准输出。
样例评测器输入格式
样例评测器从标准输入读取以下数据:
$N \ M$ $C_1 \ C_2 \dots C_{N \times M}$
其中 $C_i$ ($1 \le i \le N \times M$) 是团子 $i$ 的颜色。它是一个 $1$ 到 $N$ 之间的整数。
样例评测器输出格式
样例评测器将以下信息输出到标准输出:
- 如果你的程序被判定为正确,它会写入调用
Query函数的次数,格式为 “Accepted: 2022”。 - 如果你的程序被判定为任何一种 Wrong Answer,样例评测器会写入其类型,例如 “Wrong Answer [4]”。
如果你的程序满足多种 Wrong Answer 的条件,样例评测器仅报告其中一种。
数据范围
所有输入数据均满足以下限制。关于 $C$ 的值,请参阅“样例评测器输入格式”。
- $1 \le C_i \le N$ ($1 \le i \le N \times M$)。
- 对于每个 $j$ ($1 \le j \le N$),恰好有 $M$ 个索引 $i$ ($1 \le i \le N \times M$) 满足 $C_i = j$。
- $N, M$ 为整数。
- $C_i$ ($1 \le i \le N \times M$) 为整数。
子任务
- (2 分) $N = 4, M = 4$。
- (5 分) $N = 100, M = 10$。
- (15 分) $N = 200, M = 25$。
- (78 分) $N = 400, M = 25$。
样例
样例 1
3 2 3 3 1 2 1 2
| 调用 | 返回值 |
|---|---|
Solve(3, 2) |
|
Query([]) |
0 |
Query([4, 2, 1, 3]) |
1 |
Query([3, 4, 5]) |
0 |
Query([2, 6, 5]) |
1 |
Query([6, 5, 4, 3, 2, 1]) |
2 |
Answer([1, 6, 5]) |
|
Answer([2, 3, 4]) |
请注意,此样例输入不满足任何子任务的限制。
在可以从比赛网页下载的文件中,sample-02.txt 满足子任务 1 的限制。