QOJ.ac

QOJ

Límite de tiempo: 10 s Límite de memoria: 512 MB Puntuación total: 100 Interactivo

#13468. 地主

Estadísticas

這是一道互動題

相信你們已經幾個月沒有見過 CZL 了吧,他又回來了!我們成功地把小 U、小 Z、CZL 這三個人放在了一套題目裡面。

CZL 有一副打亂的牌,這副牌從上到下有 $n$ 張牌(牌的位置從 $0$ 開始編號),其中大小為 $0, 1, 2, \dots, n-1$ 中的一個,且不同牌的大小互不相同。現在,你要問出這副牌裡面每一張的大小,但是大魔術師怎麼能夠直接告訴你呢?

一開始,CZL 的左手和右手都停留在第 $0$ 張牌的位置。每次你可以指定讓他的左手向上移動一張牌,或者向下移動一張牌。你也可以讓他的右手向上移動一張牌,或者向下移動一張牌。你還可以向他詢問左手的牌是否比右手的牌要小。透過這些操作,你需要得到這副牌裡面從上到下每一張牌的大小。

雖然 CZL 的手很靈活,但是他還要給別的人表演魔術。所以,請你在不超過 $7.0 \cdot 10^8$ 次移動內,得到這副牌從上到下每一張牌的大小。

你的程式碼必須包含一個標頭檔 "lancllords.h",你需要實作一個函式:

vector<int> answer(int n);

這個函式中正整數 $n$ 表示牌的個數。這個函式需要回傳一個長度為 $n$ 的陣列 $P$,其中 P[i] 表示從上到下第 $i$ 張牌的大小。

我們假設 CZL 的左手在第 $p$ 張牌的位置,右手在第 $q$ 張牌的位置。你可以呼叫如下函式:

void inc_p();

表示將 CZL 的左手向下移動一張牌的位置。

void dec_p();

表示將 CZL 的左手向上移動一張牌的位置。

void inc_q();

表示將 CZL 的右手向下移動一張牌的位置。

void dec_q();

表示將 CZL 的右手向上移動一張牌的位置。

bool cmp();

表示比較第 $p$ 張牌的大小和第 $q$ 張牌的大小。若第 $p$ 張牌比第 $q$ 張牌小,則回傳 true,否則回傳 false

你每呼叫了前 $4$ 個函式,grader 的變數 $cnt$ 將增加 $1$。最終評測時,如果 $cnt$ 的值過大,該測試點算作不通過。你需要時刻保證 $0 \le p, q < n$,否則該測試點也算作不通過。

注意互動庫在前四個函式呼叫次數不超過 $7.0 \cdot 10^8$,第五個函式呼叫次數不超過 $10^7$ 的情況下,用時不超過五秒,也就是說你的程式碼有至少五秒的時間。

我們下發了 grader.cpplancllords_sample.cpp 這兩個檔案,其中 lancllords_sample.cpp 是一個選手程式碼的範例。你可以透過指令 g++ lancllords.cpp grader.cpp -o lancllords -O2 來測試你的程式。

輸入格式

第一行讀入一個正整數 $n$,表示牌的個數。

接下來一行 $n$ 個數 $P_0, \dots, P_{n-1}$,表示從上往下第 $i$ 張牌的大小。

輸出格式

由互動庫輸出資訊。在選手本地測試時,如果你中間 $p, q$ 的值越界了,那麼會輸出 "Out of bound!"。如果你回傳的答案錯誤,會輸出 "Wrong answer!",否則輸出一行 "Right Output!",另一行表示你呼叫前四個函式的次數。

我們下發檔案中的互動庫與最終互動庫是不同的!但是最終的測試方式裡面,排列仍然是預先生成好的,不會因你的詢問而改變!

範例

範例輸入 1

5
3 4 0 1 2

範例輸出 1

Right Output!
You use 100 operations!

說明 1

這個範例表示你呼叫了 $100$ 次前四個函式,最終得到了正確的排列。

範例 2

見下發檔案。

範例 3

見下發檔案。

子任務

對於所有資料 $1 \le n \le 150000$。

Subtask $1$ ($6$ pts): $n \le 1000$

Subtask $2$ ($7$ pts): $n \le 10000$

Subtask $3$ ($38$ pts): $n \le 30000$

Subtask $4$ ($25$ pts): $n \le 50000$

Subtask $5$ ($24$ pts): $n \le 150000$

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.