過咗幾百年之後,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$ 係書架上嘅書本數目。
你嘅程式可以呼叫以下函數。
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 [1].呢個格式輸出錯誤類型。
如果你嘅程式有幾種答案錯誤類型,評測程式範例只會報告其中一種。
數據範圍
所有輸入資料都符合以下條件。$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 } ),都會被判為正確。