QOJ.ac

QOJ

Límite de tiempo: 3 s Límite de memoria: 4096 MB Puntuación total: 100 Dificultad: [mostrar] Comunicación

#13549. 宝藏

Estadísticas

很久以前,Horus 和 Seth 为了争夺 Osiris 的王位继承权而展开了斗争。他们的争端由 Raa 进行裁决,Raa 给他们出了一系列挑战,以确定谁更有资格继承王位。Horus 成功赢得了所有的挑战,但 Raa 因为 Horus 年纪尚轻,仍不确定他是否有资格统治埃及。因此,Raa 决定给 Horus 最后一次挑战,以证明他的实力并彻底解决这场争斗。

Horus 的最后挑战是收集散布在埃及各地的 $N$ 个宝藏箱,编号从 $0$ 到 $N - 1$。宝藏箱的位置以二维平面上的点给出,且两两不同。具体来说,第 $i$ 个宝藏箱($0 \le i < N$)的位置是一个点 $(X[i], Y[i])$,其中 $X[i]$ 和 $Y[i]$ 均为 $0$ 到 $5 \cdot 10^8$ 之间的整数(包含边界)。

Horus 打算通过在他的莎草纸笔记本上做笔记来记录宝藏箱的位置。笔记本的每一页可以存储一个不超过 $2 \cdot 10^9$ 的非负整数。遗憾的是,在 Horus 记完所有笔记后,Seth 会打乱这些笔记本页面。

你的任务是帮助 Horus 实现两个过程: 通过在笔记本页面上书写数字来记录宝藏箱的位置; 在给定被打乱顺序的笔记本页面的情况下,恢复宝藏箱的位置。

注意,你在本题中的得分取决于所使用的页面数量,即笔记本上书写的数字个数。

实现细节

你需要实现以下两个过程:

std::vector<int> encode(std::vector<std::pair<int, int>> P)
  • $P$:长度为 $N$ 的数组,指定了宝藏箱的位置。元素 $P[i]$(对于 $0 \le i < N$)是一个二元组 $(X[i], Y[i])$,表示第 $i$ 个宝藏箱的位置。
  • 该过程应返回一个数组 $E$,表示要写在 Horus 笔记本上的数字。数组中的每个元素都是写在笔记本页面上的数字,必须是 $0$ 到 $2 \cdot 10^9$ 之间的整数(包含边界)。
  • 每个测试用例中,该过程可能会被调用多次。每次调用代表一个不同的场景。
std::vector<std::pair<int, int>> decode(std::vector<int> S)
  • $S$:整数数组。该数组是 encode 过程返回数组的打乱版本,即它具有相同的长度和相同的元素,但顺序可能不同。
  • 该过程应返回一个长度为 $N$ 的数组 $D$,指定宝藏箱的位置。数组 $D$ 中的每个元素应为一个二元组 $(x', y')$,表示一个宝藏箱的位置。
  • 数组 $D$ 中的元素可以是任意顺序。

令 $T$ 为测试用例中的场景数量。评测系统会对每个场景调用一次 encode 过程。encode 过程返回的 $T$ 个数组随后会被评测系统打乱并提供给 decode 过程。注意,encodedecode 过程在评测系统中是在不同的程序中调用的。此外,场景在两个程序中的顺序不一定相同。

数据范围

  • $1 \le T \le 100$
  • $1 \le N \le 40\,000$
  • $0 \le X[i] \le 5 \cdot 10^8$($0 \le i < N$)
  • $0 \le Y[i] \le 5 \cdot 10^8$($0 \le i < N$)
  • 没有两个宝藏箱位于相同的位置。
  • 所有场景中的宝藏箱总数不超过 $2 \cdot 10^5$。
  • 数组 $S$ 是 $E$ 的一个排列。

子任务与评分

你在本题中的得分取决于所使用的笔记本页面数量,即 encode 过程返回的数组 $E$ 的长度。对于给定的场景 $t$,令 $n_t$ 为宝藏箱的数量,$l_t$ 为 encode 过程返回的数组 $E$ 的长度。我们定义 $K$ 为所有场景中比率 $l_t / n_t$ 的最大值。

子任务 分数 额外约束及对 $K$ 的要求
1 21 $K \le 4$;对于每个 $0 \le i < N$,满足 $0 \le X[i] < 10^4$ 且 $0 \le Y[i] < 10^4$
2 79 无额外约束。

子任务 2 的得分根据 $K$ 计算如下:

条件 分数
$K \le 3$ 79
$3 < K \le 4$ 60
$4 < K \le 5$ 30
$5 < K \le 6$ 24
$6 < K$ 0

样例

评测系统进行以下过程调用:

encode([(1, 5), (3, 2), (6, 3)])

在此样例中,有 3 个宝藏箱分别位于点 $(1, 5)$,$(3, 2)$ 和 $(6, 3)$。假设 Horus 在笔记本上写下的数字为 $E = [14, 18, 221, 457, 13]$。

然后,Seth 打乱了笔记本页面,将 $E$ 转换为数组 $S = [457, 18, 13, 221, 14]$。

评测系统随后进行以下过程调用:

decode([457, 18, 13, 221, 14])

Horus 推断出原始点为 $(3, 2)$,$(6, 3)$ 和 $(1, 5)$。因此,该过程返回数组 $D = [(3, 2), (6, 3), (1, 5)]$。注意,decode 过程返回点的顺序与 encode 过程提供的顺序不必相同。

样例评测程序

样例评测程序的输入以包含单个整数 $T$ 的行开始,后跟 $T$ 个场景。每个场景按以下格式提供:

N
X[0] Y[0]
X[1] Y[1]
...
X[N-1] Y[N-1]

样例评测程序按输入中提供的相同顺序写入每个场景的结果。每个场景的输出如下。令 $L$ 为场景中 encode 过程返回的数组 $E$ 的长度,$M$ 为 decode 过程返回的数组 $D$ 的长度(在正确解中,$M$ 必须等于 $N$)。此外,令 $X'[i] = D[i].first$ 且 $Y'[i] = D[i].second$,对于 $0 \le i < M$。样例评测程序按以下格式打印场景结果:

L
M
X'[0] Y'[0]
X'[1] Y'[1]
...
X'[M-1] Y'[M-1]

此外,如果场景中 encode 返回的数组包含无效元素,样例评测程序会打印 "Invalid element in the returned array" 并立即终止。

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.