QOJ.ac

QOJ

Time Limit: 2 s Memory Limit: 256 MB Total points: 100 Interactive

#124. 圖書館

Statistics

過咗幾百年之後,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 } ),都會被判為正確。

Editorials

IDTypeStatusTitlePosted ByLast UpdatedActions
EditorialOpen Official EditorialQingyu- Download

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.