數百年過去了,JOI 城已成為一片廢墟。探險家 IOI-chan 正在探索昔日圖書館所在的區域。根據探索的結果,已知下列資訊:
- JOI 城圖書館的書架上曾有 $N$ 本書。這 $N$ 本書在書架上由左至右排成一列。
- 這 $N$ 本書的編號為 $1$ 至 $N$。不過,書架上書本的排列順序可能與書本編號的順序不同。
- 一次操作可以同時從書架取出連續擺放的書本。
遺憾的是,IOI-chan 沒有在圖書館裡找到古老的書本。不過,她找到了一臺管理圖書館書架操作的機器。如果我們以編號指定一本或多本書,並向機器發出查詢,它就會回答僅取出這些書所需的最少操作次數。
IOI-chan 想透過向機器查詢來得知書架上書本的排列順序。然而,將這 $N$ 本書的順序反轉後,機器的回答仍然相同,因此她不必區分書本是由左至右還是由右至左擺放。
由於機器老舊,她最多只能向機器發出 $20\,000$ 次查詢。
任務
請撰寫一個程式,透過向機器發出至多 $20\,000$ 次查詢,確定書架上書本的排列順序。不必區分書本是由左至右還是由右至左擺放。
實作細節
你需要提交一個檔案。
檔名為 library.cpp。其中應實作以下函式。程式應引入 library.h。
void Solve(int N)對每筆測試資料,這個函式會被呼叫一次。
- 參數
N是書架上書本的數量 $N$。
你的程式可以呼叫以下函式。
- 參數
int Query(const std::vector<int>& M)若以編號指定一本或多本書,這個函式會回傳僅從書架取出這些書所需的最少操作次數。
- 要從書架取出的書由參數
M指定,它是一個大小為 $N$ 的向量。對每個 $i$($1 \le i \le N$),若M[i-1] = 0,則不取出編號為 $i$ 的書;若M[i-1] = 1,則取出編號為 $i$ 的書。若M的大小不等於 $N$,你的程式會被判為 Wrong Answer [1]。對每個 $i$,M[i-1]應等於0或1。應至少存在一個 $i$($1 \le i \le N$)滿足M[i-1] = 1。若這兩個條件中至少一個不滿足,你的程式會被判為 Wrong Answer [2]。若呼叫Query函式超過 $20\,000$ 次,你的程式會被判為 Wrong Answer [3]。
- 要從書架取出的書由參數
void Answer(const std::vector<int>& res)你的程式透過這個函式回答書架上書本的排列順序。不必區分書本是由左至右還是由右至左擺放。
- 參數
res是一個大小為 $N$ 的向量,表示書架上書本的排列順序。對每個 $i$($1 \le i \le N$),書架上由左至右第 $i$ 本書的編號是res[i-1]。若res的大小不等於 $N$,你的程式會被判為 Wrong Answer [4]。res[i-1]應為 $1$ 至 $N$(含端點)之間的整數。若不滿足這個條件,你的程式會被判為 Wrong Answer [5]。此外,整數res[0],res[1], …,res[N-1]應互不相同。若不滿足這個條件,你的程式會被判為 Wrong Answer [6]。
- 參數
當 Solve 函式結束時,若 Answer 函式的呼叫次數不等於 $1$,你的程式會被判為 Wrong Answer [7]。
若 Solve 函式指定的書本順序與書架上的書本順序不同,你的程式會被判為 Wrong Answer [8]。不必區分書本是由左至右還是由右至左擺放。
重要注意事項
- 你的程式可以實作其他供內部使用的函式,也可以使用全域變數。
- 你的程式不應使用標準輸入與標準輸出。你的程式不應以任何方式與其他檔案通訊。不過,你的程式可以將除錯資訊輸出至標準錯誤輸出。
編譯與測試
你可以從競賽網頁下載包含範例評測程式的壓縮檔,用來測試你的程式。壓縮檔中也包含你的程式的範例原始碼檔案。
範例評測程式由一個原始碼檔案 grader.cpp 組成。若你的程式是 library.cpp,要測試它們,請將這些檔案(grader.cpp、library.cpp)與 library.h 放在同一個目錄,並執行以下指令來編譯程式。
g++ -std=c++14 -O2 -o grader grader.cpp library.cpp
編譯成功後,會產生執行檔 grader。
請注意,實際評測程式與範例評測程式不同。範例評測程式會以單一行程執行,從標準輸入讀取資料,並將結果寫入標準輸出。
範例評測程式的輸入格式
範例評測程式從標準輸入讀取以下資料。
- 第一行包含整數 $N$,表示書架上書本的數量。
- 接下來 $N$ 行中的第 $i$ 行($1 \le i \le N$)包含整數 $A_i$。這表示書架上由左至右第 $i$ 本書的編號為 $A_i$。
範例評測程式的輸出格式
程式成功結束時,範例評測程式會將以下資訊寫入標準輸出。(實際輸出不包含引號。)
- 若你的程式被判為正確,範例評測程式會以「
Accepted : 100.」的形式輸出Query函式的呼叫次數。 - 若你的程式被判為 Wrong Answer,範例評測程式會以「
Wrong Answer [1].」的形式輸出其類型。
若你的程式符合多種 Wrong Answer 類型,範例評測程式只會回報其中一種。
資料範圍
所有輸入資料都滿足下列條件。$N$ 和 $A_i$ 的意義請參閱「範例評測程式的輸入格式」。
- $1 \le N \le 1\,000$。
- $1 \le A_i \le N$($1 \le i \le N$)。
- $A_i \ne A_j$($1 \le i<j \le N$)。
子任務
共有 2 個子任務。各子任務的分數與額外限制如下:
子任務 1 [19 分]
- $N \le 200$。
子任務 2 [81 分]
沒有額外限制。
互動範例
以下是範例評測程式的範例輸入,以及對應的函式呼叫。
輸入格式 1
5 4 2 5 3 1
範例呼叫
| 呼叫 | 回傳值 | 呼叫 | 回傳值 |
|---|---|---|---|
Solve(5) |
|||
Query( { 1,1,1,0,0 } ) |
|||
2 |
|||
Answer( { 4,2,5,3,1 } ) |
|||
| (無) |
本題不必區分書本是由左至右還是由右至左擺放。因此,若你的程式以反轉後的參數呼叫 Answer( { 1,3,5,2,4 } ),也會被判為正確。