loj#P3274. 「JOISC 2020 Day2」变色龙之恋

「JOISC 2020 Day2」变色龙之恋

题目描述

题目译自 JOISC 2020 Day2 T1「カメレオンの恋 / Chameleon’s Love

注意:在 LibreOJ 上,由于语言限制,目前只支持 C++ 语言的提交。

在 JOI 动物园中,有着 2N2N 只变色龙,编号为 12N1\ldots 2N。其中,有 NN 只变色龙的性别为 X,其余 NN 只的性别为 Y。

每只变色龙都有一个原色。关于原色的可公开情报如下:

  • 所有性别为 X 的变色龙的原色不同。
  • 对于每只性别为 X 的变色龙,都存在唯一的原色与其相同的变色龙,且性别为 Y。

现在,JOI 动物园迎来了恋爱的季节。每只变色龙都爱上了另一只变色龙。关于恋爱对象的可公开情报如下:

  • 每只变色龙都很专一于唯一一只异性的变色龙。
  • 一只变色龙和它的恋爱对象的原色不同。
  • 不存在两只变色龙同时追求另一只变色龙。

你可以召集一部分变色龙来组织一场会议。对于一只参加会议的变色龙 ss,令 tt 为它的恋爱对象。ss肤色由以下方式决定:

  • 如果 tt 参加了这场会议,则 ss 的肤色为 tt 的原色。
  • 如果 tt 没参加这场会议,则 ss 的肤色为 ss 的原色。

一只变色龙的肤色可以在不同的会议间发生改变。对于你组织的一场会议,你可以得到场上所有变色龙的肤色的种类数。

由于变色龙也会感到厌烦,所以你最多只能组织 2000020\,000 场会议。同时你需要根据你得到的信息,确定有哪些变色龙的原色相同。
请你写一个程序在组织不超过 2000020\,000 场会议的前提下确定所有相同原色的变色龙。

实现细节

你需要提交一个文件。
这个文件的名字应为 chameleon.cpp\texttt{chameleon.cpp}。这个程序应当包含 chameleon.h\texttt{chameleon.h},且其中需要实现以下函数:

  • void Solve(int N)\texttt{void Solve(int N)}
    对于每组测试数据,保证这个函数会被恰好调用一次。
    • 其参数 N\texttt N 为题目中的 NN,性别为 X 的变色龙的个数。

你的程序可以调用以下函数:

  • \texttt{int Query(const std::vector<int> &p)}
    你可以通过调用这个函数组织一场会议。
    • 参数 p\texttt p 是参加这场会议的变色龙的列表。
    • 返回值即为本场会议所有变色龙的肤色的种类数。
    • p\texttt p 中的每个元素都应该是一个 [1,2N][1,2N] 内的整数,否则你的程序将会被判为 Wrong Answer [1]
    • p\texttt p 中的元素不得重复,否则你的程序将会被判为 Wrong Answer [2]
    • 你的程序不应调用 Query\texttt{Query} 函数超过 2000020\,000 次,否则你的程序将会被判为 Wrong Answer [3]
  • void Answer(int a, int b)\texttt{void Answer(int a, int b)}
    你可以通过调用这个函数回答一对原色相同的变色龙。
    • 参数 a\texttt ab\texttt b 表示变色龙 a,ba,b 的原色相同。
    • 必须保证 1a,b2N1 \le a,b \le 2N,否则你的程序将会被判为 Wrong Answer [4]
    • 你的程序不得以相同的 aa 值或 bb 值调用此函数两次及以上,否则你的程序将会被判为 Wrong Answer [5]
    • 如果 a,ba,b 的原色不同,你的程序将会被判为 Wrong Answer [6]
    • 你的程序应当调用 Answer\texttt{Answer} 函数恰好 NN 次,否则你的程序将会被判为 Wrong Answer [7]

实现提示

  • 你的程序可以实现其他函数供内部使用,或使用全局变量。
  • 你的程序不得访问标准输入输出流,也不得通过任何方法访问其他文件。不过,你的程序可以输出到标准错误流。

编译与运行

你可以在附加文件中下载到一个压缩文件,其中包含一个样例交互库以测试你的程序。这个压缩文件也包含了一个你应当提交的程序的样例。
样例交互库为 grader.cpp\texttt{grader.cpp}。为了测试你的程序,请把 $\texttt{grader.cpp},\texttt{chameleon.h},\texttt{chameleon.cpp}$ 放在同一目录下,并执行以下命令来编译你的程序:

$$\texttt{g++ -std=gnu++14 -O2 -o grader grader.cpp chameleon.cpp} $$

若编译成功,会在当前目录生成一个可执行文件 grader\texttt{grader}
请注意样例交互库并非实际交互库。样例交互库仅是由一个单一的,从标准输入流读入数据,并将结果输出到标准输出流的过程构成的。

输入格式

样例交互库从标准输入流读入以下数据:

第一行,一个整数 NN
第二行,2N2N 个整数 YiY_i,表示每只变色龙的性别,若其为 00 则性别为 X,否则为 Y。
第三行,2N2N 个整数 CiC_i,表示每只变色龙的原色,保证其在 [1,N][1,N] 内。
第四行,2N2N 个整数 LiL_i,表示每只变色龙的恋爱对象。

输出格式

样例交互库向标准输入流输出以下数据:

  • 若你的程序是正确的,样例交互库将以 Accepted: 100\texttt{Accepted: 100} 的形式输出你调用 Query\texttt{Query} 的次数。
  • 若你的程序被判为 Wrong Answer,样例交互库将以 Wrong Answer [1]\texttt{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)\texttt{Solve(4)}
Query([])\texttt{Query([])} 0\texttt0
Query([6, 2])\texttt{Query([6, 2])} 2\texttt2
Query([8, 1, 6])\texttt{Query([8, 1, 6])} 2\texttt2
Query([7, 1, 3, 5, 6, 8])\texttt{Query([7, 1, 3, 5, 6, 8])} 4\texttt4
Query([8, 6, 4, 1, 5])\texttt{Query([8, 6, 4, 1, 5])} 3\texttt3
Answer(6, 4)\texttt{Answer(6, 4)}
Answer(7, 8)\texttt{Answer(7, 8)}
Answer(2, 1)\texttt{Answer(2, 1)}
Answer(3, 5)\texttt{Answer(3, 5)}

在附加文件中,sample-02.txt\texttt{sample-02.txt} 满足第一个子任务的限制,sample-03.txt\texttt{sample-03.txt} 满足第四个子任务的限制。

数据范围与提示

对于所有数据,满足:

  • 2N5002 \le N \le 500
  • 0Yi1 (1i2N)0 \le Y_i \le 1\ (1 \le i \le 2N)
  • 1CiN (1i2N)1 \le C_i \le N\ (1 \le i \le 2N)
  • 对于每个 j (1jN)j\ (1 \le j \le N),存在一个唯一的 i (1i2N)i\ (1 \le i \le 2N) 满足 Yi=0,Ci=jY_i = 0, C_i = j
  • 对于每个 j (1jN)j\ (1 \le j \le N),存在一个唯一的 i (1i2N)i\ (1 \le i \le 2N) 满足 Yi=1,Ci=jY_i = 1, C_i = j
  • 1Li2N (1i2N)1 \le L_i \le 2N\ (1 \le i \le 2N)
  • YiYLi (1i2N)Y_i \ne Y_{L_i}\ (1 \le i \le 2N)
  • CiCLi (1i2N)C_i \ne C_{L_i}\ (1 \le i \le 2N)
  • LkLl (1k<l2N)L_k \ne L_l\ (1 \le k < l \le 2N)

详细子任务附加条件及分值如下表:

子任务编号 附加限制 分值
11 LLi=i (1i2N)L_{L_i}=i\ (1 \le i \le 2N) 44
22 N7N \le 7 2020
33 N50N \le 50 2020
44 Yi=0 (1iN)Y_i = 0\ (1 \le i \le N) 2020
55 - 3636