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 是書架上書本的數量 $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 } ),也會被判為正確。

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.