本題為互動題,限用 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 排序之後是否會被排好」。一個陣列被排序好,代表該陣列的元素為非嚴格遞增。
詳細細節與評分方式請見後續段落。
你的程式需要在一開始使用前置處理器引入 lib1431.h,詳細請參考範例實作。
你需要實作以下兩個函式:
void check_network(int N);
bool is_sorting_correct(vector<int> A);
aisort() 之後是否會被排好。你可以在 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 的公式計算。
| 評測程式端 | 參賽者程式端 |
|---|---|
呼叫 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。 |
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}
$$
範例評分程式以下列方式輸入:
範例評分程式以下列方式輸出:
如果你的程式被判斷為 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 欄位敘述的方法執行。
4 6 1 2 1 3 1 4 2 3 2 4 3 4 1 1 3 4 2
Accepted: 1
由於 Windows Defender 以及各種奇怪東西的限制,本題的範例編譯指令不提供 Windows 批次檔。編譯及測試教學請參考下列說明。
aisort.exe,請直接用命令列執行該檔案。#include "grader.cpp",並且以單一檔案的編譯執行方式測試,請注意這一行上傳時需要刪除,否則你會獲得一個 Compile Error。| No. | Testdata Range | Constraints | Score |
|---|---|---|---|
| 1 | 0 | 範例測資 | 0 |
| 2 | 0~32 | 無額外限制 | 100 |