#L3274. 「JOISC 2020 Day2」变色龙之恋
「JOISC 2020 Day2」变色龙之恋
题目描述
题目译自 JOISC 2020 Day2 T1「カメレオンの恋 / Chameleon’s Love」
在 JOI 动物园中,有着 只变色龙,编号为 。其中,有 只变色龙的性别为 X,其余 只的性别为 Y。
每只变色龙都有一个原色。关于原色的可公开情报如下:
- 所有性别为 X 的变色龙的原色不同。
- 对于每只性别为 X 的变色龙,都存在唯一的原色与其相同的变色龙,且性别为 Y。
现在,JOI 动物园迎来了恋爱的季节。每只变色龙都爱上了另一只变色龙。关于恋爱对象的可公开情报如下:
- 每只变色龙都很专一于唯一一只异性的变色龙。
- 一只变色龙和它的恋爱对象的原色不同。
- 不存在两只变色龙同时追求另一只变色龙。
你可以召集一部分变色龙来组织一场会议。对于一只参加会议的变色龙 ,令 为它的恋爱对象。 的肤色由以下方式决定:
- 如果 参加了这场会议,则 的肤色为 的原色。
- 如果 没参加这场会议,则 的肤色为 的原色。
一只变色龙的肤色可以在不同的会议间发生改变。对于你组织的一场会议,你可以得到场上所有变色龙的肤色的种类数。
由于变色龙也会感到厌烦,所以你最多只能组织 场会议。同时你需要根据你得到的信息,确定有哪些变色龙的原色相同。
请你写一个程序在组织不超过 场会议的前提下确定所有相同原色的变色龙。
实现细节
你需要提交一个文件。
这个文件的名字应为 chameleon.cpp。这个程序应当包含 chameleon.h,且其中需要实现以下函数:
void Solve(int N)
对于每组测试数据,保证这个函数会被恰好调用一次。
其参数 N 为题目中的 ,性别为 X 的变色龙的个数。
你的程序可以调用以下函数:
int Query(const std::vector<int> &p)
你可以通过调用这个函数组织一场会议。
参数 p 是参加这场会议的变色龙的列表。
返回值即为本场会议所有变色龙的肤色的种类数。
p中的每个元素都应该是一个 内的整数,否则你的程序将会被判为 Wrong Answer [1]。p中的元素不得重复,否则你的程序将会被判为 Wrong Answer [2]。- 你的程序不应调用
Query函数超过 次,否则你的程序将会被判为 Wrong Answer [3]。
void Answer(int a, int b)
你可以通过调用这个函数回答一对原色相同的变色龙。
参数 a 和 b 表示变色龙 的原色相同。
- 必须保证 ,否则你的程序将会被判为 Wrong Answer [4]。
- 你的程序不得以相同的 值或 值调用此函数两次及以上,否则你的程序将会被判为 Wrong Answer [5]。
- 如果 的原色不同,你的程序将会被判为 Wrong Answer [6]。
- 你的程序应当调用
Answer函数恰好 次,否则你的程序将会被判为 Wrong Answer [7]。
样例输入 1
输入:
4
1 0 1 0 0 1 1 0
4 4 1 2 1 2 3 3
4 3 8 7 6 5 2 1
样例调用:
| 调用 | 子调用 | 返回值 |
|---|---|---|
Solve(4) |
||
Query([]) |
0 | |
Query([6, 2]) |
2 | |
Query([8, 1, 6]) |
||
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) |
||
数据范围与提示
对于所有数据,满足:
- 。
- 。
- 。
- 对于每个 ,存在一个唯一的 满足 。
- 对于每个 ,存在一个唯一的 满足 。
- 。
- 。
- 。
- 。
详细子任务附加条件及分值如下表:
| 子任务编号 | 附加限制 | 分值 |
|---|---|---|
| 1 | 4 | |
| 2 | 20 | |
| 3 | ||
| 4 | ||
| 5 | 无附加限制 | 36 |