QOJ.ac

QOJ

时间限制: 1.0 s 内存限制: 512 MB 总分: 100 通信

#8903. 秘密消息

统计

这是一道运行两次的题目。在每个测试中,你的程序都会运行两次。

在信息学课上,Алеся 和 Борис 正在学习密码学。他们决定发明自己的消息加密方法。

Алеся 从 $1$ 到 $n$ 中选择 $k$ 个互不相同的整数,并将得到的集合记为 $T$。Алеся 希望将集合 $T$ 作为消息,以加密的形式传递给 Борис。为此,Алеся 将根据集合 $T$ 构造另一个集合 $R$ 并传递给 Борис,$R$ 同样由 $1$ 到 $n$ 中的整数组成。

他们不希望加密后消息的大小发生变化,因此 $R$ 也必须恰好包含 $k$ 个数。另外,他们认为,如果 $T$ 和 $R$ 至少有一个共同元素,那么这种加密就不够可靠。因此,不应存在同时属于 $T$ 和 $R$ 的数,也就是说,集合 $T$ 和 $R$ 不能相交。保证 $k \le n/2$,因此根据集合 $T$ 总能构造出至少一个集合 $R$。

当 Борис 收到加密消息 $R$ 时,他必须将其解密,得到原始消息 $T$。

请帮助 Алеся 和 Борис 设计并实现加密和解密算法。第一次运行时,你的程序扮演 Алеся 的角色;第二次运行时,则扮演 Борис 的角色。

输入格式

输入的第一行包含一个数 $a$,其值为 $1$ 或 $2$,表示你的程序的运行编号。

第二行包含一个数 $m$,表示你的程序需要加密(第一次运行)或解密(第二次运行)的消息数量($1 \le m \le 300\,000$)。

接下来的 $2m$ 行描述 $m$ 条消息,每条消息占两行。

每条消息的第一行包含两个整数 $n_i$ 和 $k_i$($2 \le n_i \le 10^9$,$1 \le k_i \le 300\,000$,$k_i \le \frac{n_i}{2}$)。第二行按递增顺序包含 $k_i$ 个互不相同的整数,每个整数均在 $1$ 到 $n_i$ 之间。

保证一个测试中所有 $k_i$ 的总和不超过 $300\,000$。

如果 $a = 1$,则这些数是原始消息。如果 $a = 2$,则这些数是你的程序在第一次运行时,对某条消息进行加密所产生的结果。

输出格式

程序应输出 $m$ 行,第 $i$ 行应按递增顺序包含 $k_i$ 个互不相同的整数,每个整数均在 $1$ 到 $n_i$ 之间。

第一次运行时,对于每条原始消息 $T_i$,程序应输出集合 $R_i$,且 $R_i$ 与 $T_i$ 不能相交。

第二次运行时,程序应对每条加密消息 $R_i$ 恢复原始消息 $T_i$。

样例

第一次运行

输入格式 1

1
2
2 1
1
5 2
1 4

输出格式 1

2
2 3

第二次运行

输入格式 2

2
2
5 2
2 3
2 1
2

输出格式 2

1 4
1

说明

注意,样例给出了第一次运行的输出和第二次运行的输入的具体方案。如果你的程序输出不同的集合 $R$,第二次运行的输入也会不同。

另外,第二次运行时,加密消息传递给选手程序的顺序不一定与第一次运行时的顺序相同。

子任务

为了说明输入数据的额外限制,将组成集合 $T_i$ 的数列记为 $t_1, t_2, \ldots, t_{k_i}$。它们按递增顺序排列。

将一个测试中所有 $n_i$ 的总和记为 $N$。

将一个测试中所有 $k_i$ 的总和记为 $K$。

子任务 分值 额外限制:$n_i, N$ 额外限制:$k_i, K$ 额外限制:$t_j$ 前置子任务 测试信息
1 9 $N \le 5000$ $k_i = 1$ 首次错误
2 11 $N \le 5000$ $k_i = 2$ 首次错误
3 9 $N \le 300\,000$ $k_i = \frac{n_i}{2}$ 首次错误
4 7 $n_i \le 7$,$N \le 5000$ 样例 首次错误
5 9 $t_{j+1} - t_j \ge 2$,$t_{k_i} \le n_i - 1$ 首次错误
6 9 $t_{k_i} - t_1 \le \frac{n_i}{2} - 1$ 首次错误
7 10 $N \le 5000$ $t_{k_i} \le n_i - k_i$ 首次错误
8 12 $N \le 100$ 样例 首次错误
9 3 $N \le 5000$ 样例, 1–2, 4, 7–8 首次错误
10 7 $N \le 300\,000$ 样例, 1–4, 7–9 首次错误
11 7 $K \le 5000$ 样例, 1–2, 4, 7–9 首次错误
12 7 无额外限制 样例, 1–11 首次错误

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.