QOJ.ac

QOJ

Time Limit: 1.0 s Memory Limit: 512 MB Total points: 100 Communication

#8903. 秘密訊息

Statistics

這是一道雙次執行的題目。對每個測試,你的程式都會被執行兩次。

Алеся 和 Борис 在資訊課上學習密碼學。他們決定發明自己的訊息加密方式。

Алеся 選取 $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$,程式應輸出與 $T_i$ 不相交的集合 $R_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 5\,000$ $k_i = 1$ 第一個錯誤
2 11 $N \le 5\,000$ $k_i = 2$ 第一個錯誤
3 9 $N \le 300\,000$ $k_i = \frac{n_i}{2}$ 第一個錯誤
4 7 $n_i \le 7$,$N \le 5\,000$ 範例 第一個錯誤
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 5\,000$ 範例, 1–2, 4, 7–8 第一個錯誤
10 7 $N \le 300\,000$ 範例, 1–4, 7–9 第一個錯誤
11 7 $K \le 5\,000$ 範例, 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.