在 JOI 动物园里,有 $2N$ 只变色龙,编号从 $1$ 到 $2N$。其中,$N$ 只变色龙的性别为 X,其余 $N$ 只变色龙的性别为 Y。
每只变色龙都有其原始颜色。关于原始颜色,已知以下信息: $N$ 只性别为 X 的变色龙的原始颜色各不相同。 对于每只性别为 X 的变色龙,都存在唯一一只性别为 Y 的变色龙,它们具有相同的原始颜色。
现在,JOI 动物园进入了新恋情的季节。每只变色龙都爱着另一只变色龙。关于变色龙的爱,已知以下信息: 每只变色龙恰好爱着一只性别与自己不同的变色龙。 一只变色龙和它所爱的变色龙具有不同的原始颜色。 * 不存在两只变色龙爱着同一只变色龙的情况。
你可以召集部分变色龙并组织一次会议。对于每只参加会议的变色龙 $s$,设 $t$ 为 $s$ 所爱的变色龙。$s$ 的皮肤颜色决定如下: 如果 $t$ 参加了会议,$s$ 的皮肤颜色为 $t$ 的原始颜色。 如果 $t$ 没有参加会议,$s$ 的皮肤颜色为 $s$ 的原始颜色。
变色龙的皮肤颜色可能会随不同的会议而改变。对于你组织的每次会议,你可以统计参加会议的变色龙的皮肤颜色种类数。
通过组织最多 $20\,000$ 次会议,你想要确定所有具有相同原始颜色的变色龙对。
请编写一个程序,在给定变色龙数量的情况下,通过组织最多 $20\,000$ 次会议来确定所有具有相同原始颜色的变色龙对。
实现细节
你需要提交一个文件。
提交的文件名为 chameleon.cpp。它应该实现以下函数。程序应包含 chameleon.h。
void Solve(int N)该函数对于每个测试用例仅被调用一次。- 参数 $N$ 是性别为 X 的变色龙的数量。
你的程序可以调用以下函数:
int Query(const std::vector<int> &p)通过调用此函数,你可以组织一次变色龙会议。- 参数 $p$ 是参加会议的变色龙列表。
- 返回值为参加会议的变色龙的皮肤颜色种类数。
- 参数 $p$ 中的每个元素都应是 $1$ 到 $2N$ 之间的整数(包含边界)。如果不满足此条件,你的程序将被判为 Wrong Answer [1]。
- 参数 $p$ 中的元素应互不相同。如果不满足此条件,你的程序将被判为 Wrong Answer [2]。
- 你的程序调用
Query函数的次数不得超过 $20\,000$ 次。如果不满足此条件,你的程序将被判为 Wrong Answer [3]。
void Answer(int a, int b)通过调用此函数,你回答一对具有相同原始颜色的变色龙。- 参数 $a$ 和 $b$ 表示变色龙 $a$ 和变色龙 $b$ 具有相同的原始颜色。
- 必须满足 $1 \le a \le 2N$ 且 $1 \le b \le 2N$。如果不满足这些条件,你的程序将被判为 Wrong Answer [4]。
- 对于相同的 $a$ 或 $b$ 值,你的程序调用此函数的总次数不得超过一次。如果不满足此条件,你的程序将被判为 Wrong Answer [5]。
- 如果变色龙 $a$ 和变色龙 $b$ 的原始颜色不同,你的程序将被判为 Wrong Answer [6]。
- 你的程序应恰好调用
Answer函数 $N$ 次。当Solve函数终止时,如果调用Answer函数的次数不等于 $N$,你的程序将被判为 Wrong Answer [7]。
说明
- 你的程序可以实现其他内部使用的函数,或使用全局变量。
- 你的程序不得使用标准输入和标准输出。你的程序不得通过任何方式与其他文件通信。但是,你的程序可以将调试信息输出到标准错误。
约束
所有输入数据均满足以下条件。关于 $Y, C, L$ 的含义,请参阅样例评分器的输入格式。
- $2 \le N \le 500$。
- $0 \le Y_i \le 1$ ($1 \le i \le 2N$)。
- $1 \le C_i \le N$ ($1 \le i \le 2N$)。
- 对于每个 $j$ ($1 \le j \le N$),存在唯一的 $i$ ($1 \le i \le 2N$) 满足 $Y_i = 0$ 且 $C_i = j$。
- 对于每个 $j$ ($1 \le j \le N$),存在唯一的 $i$ ($1 \le i \le 2N$) 满足 $Y_i = 1$ 且 $C_i = j$。
- $1 \le L_i \le 2N$ ($1 \le i \le 2N$)。
- $Y_i \neq Y_{L_i}$ ($1 \le i \le 2N$)。
- $C_i \neq C_{L_i}$ ($1 \le i \le 2N$)。
- $L_k \neq L_l$ ($1 \le k < l \le 2N$)。
子任务
- (4 分) $L_{L_i} = i$ ($1 \le i \le 2N$)。
- (20 分) $N \le 7$。
- (20 分) $N \le 50$。
- (20 分) $Y_i = 0$ ($1 \le i \le N$)。
- (36 分) 无附加限制。
样例通信
这里是样例评分器的一个输入示例以及对应的函数调用。
| 样例输入 1 | 样例调用 | ||
|---|---|---|---|
| 4 | 调用 | 调用 | 返回值 |
| 1 0 1 0 0 1 1 0 | Solve(4) | ||
| 4 4 1 2 1 2 3 3 | Query([]) | 0 | |
| 4 3 8 7 6 5 2 1 | Query([6, 2]) | 2 | |
| Query([8, 1, 6]) | 2 | ||
| Query([7, 1, 3, 5, 6, 8]) | 4 | ||
| Query([8, 6, 4, 1, 5]) | 3 | ||
| Answer(6, 4) | |||
| Answer(7, 8) | |||
| Answer(2, 1) | |||
| Answer(3, 5) |
在你可以从竞赛网站下载的文件中,sample-02.txt 满足子任务 1 的约束,sample-03.txt 满足子任务 4 的约束。