#P17244. [IOI 2026] 魔幻之城 / Magic City

    ID: 19743 远端评测题 500ms 2048MiB 尝试: 0 已通过: 0 显示难度NOI/NOI+/CTS 上传者: 标签>IOI交互题提交答案Special Judge2026

[IOI 2026] 魔幻之城 / Magic City

题目描述

塔什干市的市长想要重新设计著名的魔幻之城游乐园。给定一个正整数 KK,你的任务是设计一个游乐园如下:

  • 选择一个整数 NN 作为景点的数量。景点用 00N1N-1 的整数进行编号。
  • 添加若干条双向步道,每条步道连接两个不同的景点。在同一对景点之间可以有不止一条步道。不要求通过这些步道就能在任意两个景点之间通行。
  • 对于每个满足 0i<N0\le i<Nii,为景点 ii 分配一个类型 T[i]T[i]。共有 2K2K 种类型,编号为从 002K12K-1。每种类型必须至少分配给一个景点。不同景点可以有相同类型。

市场调研表明:

  1. 每位游客希望游览三个景点,但不要连续游览两个相同类型的景点。
  2. 如果一个景点和很多步道相连,游客往往不喜欢。

为了满足所有潜在游客的需求,市长对你的设计提出了两个要求。

对于满足 0t1,t2,t3<2K0\le t_1,t_2,t_3<2K、由类型构成的有序三元组 (t1,t2,t3)(t_1,t_2,t_3),若满足 t1t2t_1\ne t_2t2t3t_2\ne t_3,我们称之为有趣的三元组。注意 t1t_1 可能等于 t3t_3。因此,共有

2K(2K1)22K\cdot(2K-1)^2

个有趣的三元组。

条件 1: 对于每个有趣的三元组 (t1,t2,t3)(t_1,t_2,t_3),必须存在三个景点 a1,a2,a3a_1,a_2,a_3(有 0a1,a2,a3<N0\le a_1,a_2,a_3<N),满足:

  • a1,a2,a3a_1,a_2,a_3 的类型与 t1,t2,t3t_1,t_2,t_3 匹配。即 T[a1]=t1T[a_1]=t_1T[a2]=t2T[a_2]=t_2,且 T[a3]=t3T[a_3]=t_3
  • a1a_1a2a_2 之间有一条步道。
  • a2a_2a3a_3 之间有一条步道。

a1a_1a3a_3 之间是否存在步道无关紧要。另外请注意,当 t1=t3t_1=t_3 时,a1a_1a3a_3 可以是同一个景点。

条件 2: 每个景点最多和 KK 条步道相连

本任务包含 5050提交答案型子任务,并且有部分分。每个子任务对应一个特定的 KK 值,你必须为每个 KK 值设计一个满足上述所有条件的游乐园。你的得分取决于你答案中的景点数量:景点越少,得分越高或持平。

实现细节

有两种提交答案的方式,你可以为每个子任务选择其中一种:

  • 函数调用
  • 输出文件

函数调用

通过函数调用提交答案时,你要实现以下函数:

std::pair<std::vector<int>, std::vector<std::pair<int, int>>>
construct(int K)
  • KK:类型总数的一半,同时也是每个景点允许连接的最大步道数。
  • 对每个子任务,该函数恰好被调用一次。

该函数应返回一个二元组 (T,E)(T,E),以给出游乐园的设计。假定你的游乐园中步道的数量为 MM

  • TT:长度为 NN 的数组,给出景点的类型。
  • EE:长度为 MM 的数组,给出所有步道。对于每个满足 0j<M0\le j<MjjE[j]=(U[j],V[j])E[j]=(U[j],V[j]) 表示不同景点 U[j]U[j]V[j]V[j] 之间的一条双向步道。

输出文件

通过输出文件提交答案时,你要创建并提交一个如下格式的文本文件:

N M
T[0] T[1] ... T[N-1]
U[0] V[0]
U[1] V[1]
...
U[M-1] V[M-1]

注意,你的答案必须满足以下约束条件才能被视为符合要求

  • N2000N\le 2000
  • 对于每个 0i<N0\le i<N,都有 0T[i]<2K0\le T[i]<2K,而且每个类型应该分配给至少一个景点。
  • 对于每个 0j<M0\le j<M,都有 0U[j],V[j]<N0\le U[j],V[j]<NU[j]V[j]U[j]\ne V[j]
  • 必须满足条件 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)

在这个例子中,K=1K=1,因此有 2K=22K=2 种景点类型。下图展示了一个包含 N=4N=4 个景点和 M=2M=2 条步道的符合要求的答案。景点 0,1,20,1,2 的类型为 00,景点 33 的类型为 11

:::align{center} :::

这里共有两个有趣的三元组:

  • 对于类型三元组 (0,1,0)(0,1,0),我们可以选择 (a1,a2,a3)=(2,3,2)(a_1,a_2,a_3)=(2,3,2)
  • 对于类型三元组 (1,0,1)(1,0,1),我们可以选择 (a1,a2,a3)=(3,2,3)(a_1,a_2,a_3)=(3,2,3)

这表明条件 1 已满足。

该函数可以返回二元组 ([0,0,0,1],[(0,1),(2,3)])([0,0,0,1],[(0,1),(2,3)])。请注意,此处提供的答案可能不是 K=1K=1 时的最优解。

约束条件

  • 1K501\le K\le 50

评分

共有 5050 个子任务,分别对应从 115050 的整数 KK。对于子任务 ii1i501\le i\le 50),KK 的值为 ii

每个子任务都有一个分值 SS 和景点的目标数量 PP,如下表所示:

子任务 SS PP
11 22
22 88 1212
33 99 2424
44 4040
55 5050
66 - 1010 44 12K12\cdot K
1111 - 1212 33
1313 - 5050 11

对于每个子任务,如果你的答案未给出一个符合要求的游乐园,则你的得分为 00(在 CMS 中报告为 Output isn't correct)。

否则,你的得分将根据下表由 NN 以及参数 SSPP 计算:

条件 分数
NPN\le P SS
P<N2PP<N\le 2P (0.4+0.32PNP)S\left(0.4+0.3\cdot\dfrac{2P-N}{P}\right)\cdot S
2P<N20002P<N\le 2000 (0.1+0.32PN)S\left(0.1+0.3\cdot\dfrac{2P}{N}\right)\cdot S