#P9323. [EGOI2022] Toy Design / 玩具设计

[EGOI2022] Toy Design / 玩具设计

题目背景

Day 2 Problem C.

题面译自 EGOI2022 toydesign

题目描述

本题是一道 Grader 交互题。

你在一个设计玩具的公司工作。一个将被制作的玩具如下:有 nn 个大头针,编号从 11nn,从盒子中伸出。几对大头针被铁丝在盒子中相连。(换句话说,大头针和铁丝组成了一个无向图,其中大头针是节点、铁丝是边。)铁丝无法从盒子外部看到,唯一获得关于他们的信息的方法是对大头针使用一个检测器:我们选择两个大头针 i,ji,jiji\ne j),检测器会告诉你这两个大头针是否连通,包括直接和间接。(因此,检测器告诉你图中这两个大头针之间是否有一条路径。)

我们称一组连接方式为玩具的设计方案

你正在使用一个专用的软件来查询和进行设计。软件工作方式如下:从某个称为“00 号方案”的设计方案开始。他不会告诉你盒子内部的铁丝是什么样的。你需要重复进行以下的三步操作:

  1. 选择一个设计方案 aa 和两个大头针 i,ji,jiji\ne j)。
  2. 软件告诉你对这两个大头针使用检测器的结果。换句话说,它告诉你在设计方案 aaiijj 是否(直接或间接地)连通。
  3. 同时,如果这两个大头针在设计方案 aa 中没有被直接或间接地连接,它会创建一个新的设计方案,包含设计方案 aa 中的所有铁丝,同时添加一个直接连接 i,ji,j 的铁丝。这个设计方案的编号为下一个可用的编号。(所以,第一个创建的设计方案是 11 号方案,然后是 22 号,以此类推。)请注意这不会修改设计方案 aa,只会新建一个设计方案包含新的铁丝。

你的目标是使用这种操作获取尽可能多的 00 号方案的信息。

请注意并不总是可能求出 00 号方案的准确的铁丝连接方式,因为无法区分直接和间接的连接。例如,考虑如下的两种 n=3n=3 的设计方案:

检测器会认为两种方案中任意一对大头针都连通,所以我们无法利用上述软件区分它们。

你的目标是求出任何一种设计方案,使得它与 00 号方案等价。两种设计方案等价当且仅当对于任意一对大头针,检测器在两种方案中都返回相同结果。

输出格式

交互方式

你需要实现一个函数:

void ToyDesign(int n, int max_ops);

作用是给出一种与 00 号方案等价的设计方案。你可以调用以下两个函数来实现这一点。你可以调用的第一个函数为:

int Connected(int a, int i, int j);

其中 1i,jn1\le i,j\le niji\ne ja0a\ge 0,且 aa 不能超过目前已有的设计方案数。如果在设计方案 aa 中,大头针 i,ji,j 是(直接或间接地)连通的,它的返回值是 aa。否则,它的返回值是已有的设计方案数加一,就是包含 aa 的所有铁丝以及一根连接 i,ji,j 的铁丝的新的设计方案的编号。函数 Connected 可以被调用最多 max_ops 次。

当你的程序完成了需要的 Connected 调用,它应该描述一种等价于 00 号方案的设计方案。为了描述一个方案,程序应当调用:

void DescribeDesign(std::vector<std::pair<int, int>> result);

参数 result 是整数对的向量,描述大头针之间的直接铁丝连接。每对数描述一根铁丝,包含被连接的两个大头针的编号。在任意一对(无序的)大头针对之间必须只有至多一根铁丝,且不能有铁丝连接一个大头针和它自己。一旦调用这个函数,你的程序将被终止。

提示

样例交互过程

选手程序 Grader 解释
ToyDesign(4, 20) 玩具中有 44 个大头针。你需要在 2020Connected 调用内,给出任何一种等价于 00 号方案的设计方案。
Connected(0, 1, 2) 返回 11 大头针 1,21,200 号方案中不直接或间接地连通。新的设计方案是 11 号。
Connected(1, 3, 2) 返回 22 大头针 3,23,211 号方案中不直接或间接地连通。新的设计方案是 22 号。
Connected(0, 3, 4) 返回 00 大头针 3,43,400 号方案中直接或间接地连通。没有新的设计方案。
DescribeDesign({{3, 4}}) 描述一个只有一根铁丝的设计方案:连接大头针 3,43,4

数据范围

对于全部数据,2n2002\le n\le 200

  • 子任务一(1010 分):n200n\le 200max_ops2000020000
  • 子任务二(2020 分):n8n\le 8max_ops2020
  • 子任务三(3535 分):n200n\le 200max_ops20002000
  • 子任务四(3535 分):n200n\le 200max_ops13501350