TopCoder

餘切
$\huge\text{owoovo is 8}$

User's AC Ratio

80.0% (4/5)

Submission's AC Ratio

39.0% (16/41)

Tags

Description

本題為互動題,限用 C++ 作答。你可以在這裡找到範例實作以及範例評分程式,詳細注意事項以及常見問題請參考 Hints。

在生成式 AI 日漸強大的年代,有些人甚至連最簡單的排序要怎麼做都忘記了。小明的公司希望他們的產品多使用 AI,而小明在無奈之下,找到了下圖的神秘工具。

小明好奇的打開了這個函式庫的程式碼,發現 AI 在收到使用者輸入的陣列之後,竟然是「憑感覺」選擇一些位置比較!具體來說,這個 AI 排序的方法是使用某個不一定有效的排序網路。對於一個大小 $N$ 的陣列 $A$,AI 會產生

$$P = [(x_1, y_1), (x_2, y_2), \dots, (x_k, y_k)]$$

符合 $\forall 1 \le i \le k, 1 \le x_i < y_i \le n$。AI 會重複 $k$ 次以下動作:在第 $i$ 次,如果 $A_{x_i} > A_{y_i}$,那麼交換 $A_{x_i}$ 和 $A_{y_i}$。

小明覺得貿然使用這個未知的排序演算法實在是太危險了,因此他決定寫一個程式驗證 AI 排序的結果是否正確。具體來說,他可以呼叫函數 vector<int> aisort(vector<int> A),回傳的結果是陣列 $A$ 經過排序的結果。之後,小明會收到 $Q$ 個使用者傳進來的陣列,而他需要回答「這個陣列經過 AI 排序之後是否會被排好」。一個陣列被排序好,代表該陣列的元素為非嚴格遞增。

詳細細節與評分方式請見後續段落。

Implementation Details

本題請不要使用標準輸入輸出流,不過你仍然可以輸出除錯訊息至標準錯誤流(stderr)。

你的程式需要在一開始使用前置處理器引入 lib1431.h,詳細請參考範例實作。

你需要實作以下兩個函式:

void check_network(int N);
  • 對於輸入的陣列大小 $N$,判斷排序網路 $P$ 的正確性。
bool is_sorting_correct(vector<int> A);
  • 對於使用者的輸入陣列 $A$,回傳 $A$ 經過 aisort() 之後是否會被排好。
  • 保證 $A$ 的長度為 $N$,且 $A$ 的所有數值皆相異。

你可以在 check_network() 的實作裡呼叫以下函式若干次:

vector<int> aisort(vector<int> A);

將陣列 $A$ 使用 AI 排序法。回傳的結果為 $A$ 經過排序的結果。注意,$A$ 的長度必須為 $N$,否則你會獲得 WA。

評測系統會用以下過程執行每一筆測試資料:

  • 呼叫 check_network(N) 一次。
  • 呼叫 is_sorting_correct() $Q$ 次,並檢查回傳值是否正確。

如果任意一個 is_sorting_correct() 的回傳值錯誤,你會獲得 WA,否則你的分數會依照下方 Scoring 的公式計算。

Example

假設 $N = 4, k = 6$,一個可能被判斷為 Accepted 的範例互動狀況如下:


評測程式端 參賽者程式端
呼叫 check_network(4)。
呼叫 aisort({3, 2, 4, 1})。
回傳 {1, 2, 3, 4}。
呼叫 aisort({0, 0, 0, 0})。
回傳 {0, 0, 0, 0}。
check_network() 函式 return。
呼叫 is_sorting_correct({1, 3, 4, 2})。
回傳 true。

Constraints

  • $2 \leq N \leq 9$
  • $1 \leq Q \leq 20000$
  • $1 \leq k \leq 100$,$k$ 為排序網路的交換次數。

Scoring

令 $C$ 為所有測資中,呼叫 aisort() 的最大次數。你的得分為

$$
\begin{cases}
100, & \text{ if } C \le 125 \\
\frac{100}{1 + \frac{1}{2}\log_2 \frac{C}{125}}, & \text{ if } C > 125
\end{cases}
$$

Input Format

範例評分程式以下列方式輸入:

  • 第一行輸入整數 $N$ $k$
  • 接下來 $k$ 行每行有兩個整數 $x_i$ $y_i$,代表排序網路中的第 $i$ 次比較。
  • 下一行輸入整數 $Q$
  • 接下來 $Q$ 行每行有 $N$ 個整數 $A_1, A_2, \dots, A_N$,代表詢問的陣列 $A$。

Output Format

範例評分程式以下列方式輸出:

如果你的程式被判斷為 Accepted,範例評分程式會輸出 Accepted: C,其中 C 為你的程式呼叫 aisort() 的次數。

如果你的程式被判斷為 Wrong Answer,範例評分程式會輸出 WA: MSG,其中 MSG 以及其代表的意思為以下列表的其中一個:

  • Invalid call to aisort: 呼叫 aisort() 時陣列 $A$ 的長度不等於 $N$。
  • Cannot call aisort() inside is_sorting_correct().: 不能在回答詢問時呼叫 aisort()。
  • On query X, Expected A, got B: 答案在第 $X$ 個詢問錯誤。評分程式只會輸出第一個錯誤的詢問。

如果有多個原因,範例評分程式只會輸出任何一個。

請注意,範例評分程式的評測方法與實際評分程式不同,實際評測系統會用在 Implementation Details 欄位敘述的方法執行。

Sample Input 1

4 6
1 2
1 3
1 4
2 3
2 4
3 4
1
1 3 4 2

Sample Output 1

Accepted: 1

Hints

由於 Windows Defender 以及各種奇怪東西的限制,本題的範例編譯指令不提供 Windows 批次檔。編譯及測試教學請參考下列說明。

  • 如果你的系統是 Linux 或 MacOS,你可以直接執行 compile.sh 編譯你的程式,編譯結果會是 aisort.exe,請直接用命令列執行該檔案。
  • 如果你的系統是 Windows,你有以下的選擇:
    1. 本地測試時加入 #include "grader.cpp",並且以單一檔案的編譯執行方式測試,請注意這一行上傳時需要刪除,否則你會獲得一個 Compile Error。
    2. 將 compile.sh 的變數替換後直接於命令列執行,請注意你需要確保 g++ 在系統的環境變數 PATH 中。
    3. 如果你的電腦已經有 WSL (Windows Subsystem for Linux),你可以直接使用 WSL 並按照 Linux 的做法。
    4. 使用電腦教室的 Ubuntu(啟動時可以選擇系統)並按照 Linux 的做法。

Problem Source

Subtasks

No. Testdata Range Constraints Score
1 0 範例測資 0
2 0~32 無額外限制 100

Testdata and Limits

No. Time Limit (ms) Memory Limit (VSS, KiB) Output Limit (KiB) Subtasks
0 1000 2097152 65536 1 2
1 1000 2097152 65536 2
2 1000 2097152 65536 2
3 1000 2097152 65536 2
4 1000 2097152 65536 2
5 1000 2097152 65536 2
6 1000 2097152 65536 2
7 1000 2097152 65536 2
8 1000 2097152 65536 2
9 1000 2097152 65536 2
10 1000 2097152 65536 2
11 1000 2097152 65536 2
12 1000 2097152 65536 2
13 1000 2097152 65536 2
14 1000 2097152 65536 2
15 1000 2097152 65536 2
16 1000 2097152 65536 2
17 1000 2097152 65536 2
18 1000 2097152 65536 2
19 1000 2097152 65536 2
20 1000 2097152 65536 2
21 1000 2097152 65536 2
22 1000 2097152 65536 2
23 1000 2097152 65536 2
24 1000 2097152 65536 2
25 1000 2097152 65536 2
26 1000 2097152 65536 2
27 1000 2097152 65536 2
28 1000 2097152 65536 2
29 1000 2097152 65536 2
30 1000 2097152 65536 2
31 1000 2097152 65536 2
32 1000 2097152 65536 2