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

「JOISC 2020 Day2」变色龙之恋

题目描述

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

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

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

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

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

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

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

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

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

由于变色龙也会感到厌烦,所以你最多只能组织 2000020\,000 场会议。同时你需要根据你得到的信息,确定有哪些变色龙的原色相同。

请你写一个程序在组织不超过 2000020\,000 场会议的前提下确定所有相同原色的变色龙。


实现细节

你需要提交一个文件。

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

void Solve(int N)

对于每组测试数据,保证这个函数会被恰好调用一次。
其参数 N 为题目中的 NN,性别为 X 的变色龙的个数。

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

int Query(const std::vector<int> &p)

你可以通过调用这个函数组织一场会议。
参数 p 是参加这场会议的变色龙的列表。
返回值即为本场会议所有变色龙的肤色的种类数。

  • p 中的每个元素都应该是一个 [1,2N][1,2N] 内的整数,否则你的程序将会被判为 Wrong Answer [1]
  • p 中的元素不得重复,否则你的程序将会被判为 Wrong Answer [2]
  • 你的程序不应调用 Query 函数超过 2000020\,000 次,否则你的程序将会被判为 Wrong Answer [3]
void Answer(int a, int b)

你可以通过调用这个函数回答一对原色相同的变色龙。
参数 ab 表示变色龙 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 函数恰好 NN 次,否则你的程序将会被判为 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)

数据范围与提示

对于所有数据,满足:

  • 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)

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

子任务编号 附加限制 分值
1 LLi=i (1i2N)L_{L_i}=i\ (1 \le i \le 2N) 4
2 N7N \le 7 20
3 N50N \le 50
4 Yi=0 (1iN)Y_i = 0\ (1 \le i \le N)
5 无附加限制 36