#P17244. [IOI 2026] 魔幻之城 / Magic City
[IOI 2026] 魔幻之城 / Magic City
题目描述
塔什干市的市长想要重新设计著名的魔幻之城游乐园。给定一个正整数 ,你的任务是设计一个游乐园如下:
- 选择一个整数 作为景点的数量。景点用 到 的整数进行编号。
- 添加若干条双向步道,每条步道连接两个不同的景点。在同一对景点之间可以有不止一条步道。不要求通过这些步道就能在任意两个景点之间通行。
- 对于每个满足 的 ,为景点 分配一个类型 。共有 种类型,编号为从 到 。每种类型必须至少分配给一个景点。不同景点可以有相同类型。
市场调研表明:
- 每位游客希望游览三个景点,但不要连续游览两个相同类型的景点。
- 如果一个景点和很多步道相连,游客往往不喜欢。
为了满足所有潜在游客的需求,市长对你的设计提出了两个要求。
对于满足 、由类型构成的有序三元组 ,若满足 且 ,我们称之为有趣的三元组。注意 可能等于 。因此,共有
个有趣的三元组。
条件 1: 对于每个有趣的三元组 ,必须存在三个景点 (有 ),满足:
- 的类型与 匹配。即 ,,且 。
- 与 之间有一条步道。
- 与 之间有一条步道。
与 之间是否存在步道无关紧要。另外请注意,当 时, 和 可以是同一个景点。
条件 2: 每个景点最多和 条步道相连。
本任务包含 个提交答案型子任务,并且有部分分。每个子任务对应一个特定的 值,你必须为每个 值设计一个满足上述所有条件的游乐园。你的得分取决于你答案中的景点数量:景点越少,得分越高或持平。
实现细节
有两种提交答案的方式,你可以为每个子任务选择其中一种:
- 函数调用
- 输出文件
函数调用
通过函数调用提交答案时,你要实现以下函数:
std::pair<std::vector<int>, std::vector<std::pair<int, int>>>
construct(int K)
- :类型总数的一半,同时也是每个景点允许连接的最大步道数。
- 对每个子任务,该函数恰好被调用一次。
该函数应返回一个二元组 ,以给出游乐园的设计。假定你的游乐园中步道的数量为 。
- :长度为 的数组,给出景点的类型。
- :长度为 的数组,给出所有步道。对于每个满足 的 , 表示不同景点 与 之间的一条双向步道。
输出文件
通过输出文件提交答案时,你要创建并提交一个如下格式的文本文件:
N M
T[0] T[1] ... T[N-1]
U[0] V[0]
U[1] V[1]
...
U[M-1] V[M-1]
注意,你的答案必须满足以下约束条件才能被视为符合要求:
- 对于每个 ,都有 ,而且每个类型应该分配给至少一个景点。
- 对于每个 ,都有 且 。
- 必须满足条件 1 和条件 2。
输入格式
K
输出格式
N M
T[0] T[1] ... T[N-1]
U[0] V[0]
U[1] V[1]
...
U[M-1] V[M-1]
请注意,评测程序示例的输出结果满足输出文件的格式要求。
提示
例子
考虑以下调用:
construct(1)
在这个例子中,,因此有 种景点类型。下图展示了一个包含 个景点和 条步道的符合要求的答案。景点 的类型为 ,景点 的类型为 。
:::align{center}
:::
这里共有两个有趣的三元组:
- 对于类型三元组 ,我们可以选择 。
- 对于类型三元组 ,我们可以选择 。
这表明条件 1 已满足。
该函数可以返回二元组 。请注意,此处提供的答案可能不是 时的最优解。
约束条件
评分
共有 个子任务,分别对应从 到 的整数 。对于子任务 (), 的值为 。
每个子任务都有一个分值 和景点的目标数量 ,如下表所示:
| 子任务 | ||
|---|---|---|
| - | ||
| - | ||
| - | ||
对于每个子任务,如果你的答案未给出一个符合要求的游乐园,则你的得分为 (在 CMS 中报告为 Output isn't correct)。
否则,你的得分将根据下表由 以及参数 和 计算:
| 条件 | 分数 |
|---|---|