题目描述
题目译自 JOISC 2020 Day2 T1「カメレオンの恋 / Chameleon’s Love」
注意:在 LibreOJ 上,由于语言限制,目前只支持 C++ 语言的提交。
在 JOI 动物园中,有着 2N 只变色龙,编号为 1…2N。其中,有 N 只变色龙的性别为 X,其余 N 只的性别为 Y。
每只变色龙都有一个原色。关于原色的可公开情报如下:
- 所有性别为 X 的变色龙的原色不同。
- 对于每只性别为 X 的变色龙,都存在唯一的原色与其相同的变色龙,且性别为 Y。
现在,JOI 动物园迎来了恋爱的季节。每只变色龙都爱上了另一只变色龙。关于恋爱对象的可公开情报如下:
- 每只变色龙都很专一于唯一一只异性的变色龙。
- 一只变色龙和它的恋爱对象的原色不同。
- 不存在两只变色龙同时追求另一只变色龙。
你可以召集一部分变色龙来组织一场会议。对于一只参加会议的变色龙 s,令 t 为它的恋爱对象。s 的肤色由以下方式决定:
- 如果 t 参加了这场会议,则 s 的肤色为 t 的原色。
- 如果 t 没参加这场会议,则 s 的肤色为 s 的原色。
一只变色龙的肤色可以在不同的会议间发生改变。对于你组织的一场会议,你可以得到场上所有变色龙的肤色的种类数。
由于变色龙也会感到厌烦,所以你最多只能组织 20000 场会议。同时你需要根据你得到的信息,确定有哪些变色龙的原色相同。
请你写一个程序在组织不超过 20000 场会议的前提下确定所有相同原色的变色龙。
实现细节
你需要提交一个文件。
这个文件的名字应为 chameleon.cpp。这个程序应当包含 chameleon.h,且其中需要实现以下函数:
- void Solve(int N)
对于每组测试数据,保证这个函数会被恰好调用一次。
- 其参数 N 为题目中的 N,性别为 X 的变色龙的个数。
你的程序可以调用以下函数:
- \texttt{int Query(const std::vector<int> &p)}
你可以通过调用这个函数组织一场会议。
- 参数 p 是参加这场会议的变色龙的列表。
- 返回值即为本场会议所有变色龙的肤色的种类数。
- p 中的每个元素都应该是一个 [1,2N] 内的整数,否则你的程序将会被判为 Wrong Answer [1]。
- p 中的元素不得重复,否则你的程序将会被判为 Wrong Answer [2]。
- 你的程序不应调用 Query 函数超过 20000 次,否则你的程序将会被判为 Wrong Answer [3]。
- void Answer(int a, int b)
你可以通过调用这个函数回答一对原色相同的变色龙。
- 参数 a 和 b 表示变色龙 a,b 的原色相同。
- 必须保证 1≤a,b≤2N,否则你的程序将会被判为 Wrong Answer [4]。
- 你的程序不得以相同的 a 值或 b 值调用此函数两次及以上,否则你的程序将会被判为 Wrong Answer [5]。
- 如果 a,b 的原色不同,你的程序将会被判为 Wrong Answer [6]。
- 你的程序应当调用 Answer 函数恰好 N 次,否则你的程序将会被判为 Wrong Answer [7]。
实现提示
- 你的程序可以实现其他函数供内部使用,或使用全局变量。
- 你的程序不得访问标准输入输出流,也不得通过任何方法访问其他文件。不过,你的程序可以输出到标准错误流。
编译与运行
你可以在附加文件中下载到一个压缩文件,其中包含一个样例交互库以测试你的程序。这个压缩文件也包含了一个你应当提交的程序的样例。
样例交互库为 grader.cpp。为了测试你的程序,请把 $\texttt{grader.cpp},\texttt{chameleon.h},\texttt{chameleon.cpp}$ 放在同一目录下,并执行以下命令来编译你的程序:
$$\texttt{g++ -std=gnu++14 -O2 -o grader grader.cpp chameleon.cpp}
$$
若编译成功,会在当前目录生成一个可执行文件 grader。
请注意样例交互库并非实际交互库。样例交互库仅是由一个单一的,从标准输入流读入数据,并将结果输出到标准输出流的过程构成的。
输入格式
样例交互库从标准输入流读入以下数据:
第一行,一个整数 N。
第二行,2N 个整数 Yi,表示每只变色龙的性别,若其为 0 则性别为 X,否则为 Y。
第三行,2N 个整数 Ci,表示每只变色龙的原色,保证其在 [1,N] 内。
第四行,2N 个整数 Li,表示每只变色龙的恋爱对象。
输出格式
样例交互库向标准输入流输出以下数据:
- 若你的程序是正确的,样例交互库将以 Accepted: 100 的形式输出你调用 Query 的次数。
- 若你的程序被判为 Wrong Answer,样例交互库将以 Wrong Answer [1] 的形式输出其类型。
若你的程序触发了不止一种 Wrong Answer,样例交互库只会输出其中一种。
样例
样例输入 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]) |
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 满足第一个子任务的限制,sample-03.txt 满足第四个子任务的限制。
数据范围与提示
对于所有数据,满足:
- 2≤N≤500。
- 0≤Yi≤1 (1≤i≤2N)。
- 1≤Ci≤N (1≤i≤2N)。
- 对于每个 j (1≤j≤N),存在一个唯一的 i (1≤i≤2N) 满足 Yi=0,Ci=j。
- 对于每个 j (1≤j≤N),存在一个唯一的 i (1≤i≤2N) 满足 Yi=1,Ci=j。
- 1≤Li≤2N (1≤i≤2N)。
- Yi=YLi (1≤i≤2N)。
- Ci=CLi (1≤i≤2N)。
- Lk=Ll (1≤k<l≤2N)。
详细子任务附加条件及分值如下表:
子任务编号 |
附加限制 |
分值 |
1 |
LLi=i (1≤i≤2N) |
4 |
2 |
N≤7 |
20 |
3 |
N≤50 |
20 |
4 |
Yi=0 (1≤i≤N) |
20 |
5 |
- |
36 |