QOJ.ac

QOJ

Time Limit: 5 s Memory Limit: 1024 MB Total points: 100 Interactive

#6335. 輸送帶

Statistics

JOI Co., Ltd. 嘅工廠有 $N$ 張枱,編號由 $0$ 到 $N-1$。工廠有 $N-1$ 條輸送帶,編號由 $0$ 到 $N-2$。輸送帶 $i$ ($0\le i\le N-2$) 連接枱 $A_i$ 同枱 $B_i$,將產品由其中一張枱運去另一張枱。不過,我哋睇唔到輸送方向。如果忽略輸送帶嘅方向,任何兩張枱都可以透過若干條輸送帶互相連通。

IOI-kun 係工廠主管。佢唔記得咗每條輸送帶嘅輸送方向,所以會重複執行以下一連串操作。

  1. 揀若干條輸送帶,將佢哋嘅輸送方向反轉。
  2. 揀若干張枱,喺每張揀中嘅枱上放一件產品。
  3. 對每張放咗產品嘅枱,以下其中一種情況會同時發生。

    • 如果冇輸送帶由呢張枱向外輸送產品,就乜都唔會發生。
    • 如果有輸送帶由呢張枱向外輸送產品,枱上嘅產品就會由其中一條輸送帶運走。產品會停喺嗰條輸送帶嘅目的地,之後唔會再移動。
  4. IOI-kun 檢查每張枱上係咪有至少一件產品。如果有,就將嗰張枱上嘅所有產品拎走。

  5. 將操作 1 入面反轉過方向嘅每條輸送帶再反轉一次,恢復原本方向。

IOI-kun 想透過執行以上整套操作最多 30 次,確定每條輸送帶嘅原本方向。

請寫一個程式,畀定每條輸送帶連接嘅枱嘅資料,實作 IOI-kun 嘅策略,透過執行以上整套操作最多 30 次,確定每條輸送帶嘅原本方向。

實作細節

你需要提交一個檔案。

檔案名係 conveyor.cpp,需要實作以下函式。程式要用預處理指令 #include 引入 conveyor.h。

喺 conveyor.cpp 入面,要實作以下函式。

  • void Solve(int N, std::vector<int> A, std::vector<int> B)

    每組測試資料只會呼叫呢個函式一次。

    • 參數 N 係枱嘅數目 $N$。
    • 參數 A、B 係長度為 $N-1$ 嘅陣列,描述輸送帶連接嘅枱。

你嘅程式可以呼叫以下函式。

  • std::vector<int> Query(std::vector<int> x, std::vector<int> y)

    IOI-kun 透過呢個函式喺工廠執行操作。

    • 參數 x 係長度為 $N-1$ 嘅陣列。對 $0\le i\le N-2$,如果 $x[i]=1$,IOI-kun 就反轉輸送帶 $i$ 嘅方向;如果 $x[i]=0$,就唔反轉。
    • 參數 y 係長度為 $N$ 嘅陣列。對 $0\le j\le N-1$,如果 $y[j]=1$,IOI-kun 就喺枱 $j$ 上放一件產品;如果 $y[j]=0$,就唔放。
    • 設呢個函式嘅回傳值係 z,佢係長度為 $N$ 嘅陣列。對 $0\le j\le N-1$,如果 $z[j]=1$,枱 $j$ 上就有至少一件產品;如果 $z[j]=0$,枱 $j$ 上就冇產品。
    • 陣列 x 嘅長度必須等於 $N-1$。唔符合就會判為 Wrong Answer [1]。
    • 陣列 x 嘅每個元素都必須係 0 或 1。唔符合就會判為 Wrong Answer [2]。
    • 陣列 y 嘅長度必須等於 $N$。唔符合就會判為 Wrong Answer [3]。
    • 陣列 y 嘅每個元素都必須係 0 或 1。唔符合就會判為 Wrong Answer [4]。
    • Query 唔可以呼叫超過 30 次。如果超過 30 次,就會判為 Wrong Answer [5]。
  • void Answer(std::vector<int> a)

    IOI-kun 透過呢個函式報告每條輸送帶嘅原本方向。

    • 參數 a 係長度為 $N-1$ 嘅陣列。對 $0\le i\le N-2$,如果 $a[i]=0$,輸送帶 $i$ 將產品由 $A_i$ 運去 $B_i$;如果 $a[i]=1$,就由 $B_i$ 運去 $A_i$。
    • 陣列 a 嘅長度必須等於 $N-1$。唔符合就會判為 Wrong Answer [6]。
    • 陣列 a 嘅每個元素都必須係 0 或 1。唔符合就會判為 Wrong Answer [7]。
    • 如果 IOI-kun 報告咗任何一條輸送帶嘅錯誤方向,就會判為 Wrong Answer [8]。
    • Answer 必須恰好呼叫一次。如果呼叫多過一次,就會判為 Wrong Answer [9]。當 Solve 結束時,如果冇呼叫過 Answer,就會判為 Wrong Answer [10]。

重要事項

  • 程式可以實作其他供內部使用嘅函式,亦可以使用全域變數。
  • 程式唔可以使用標準輸入同標準輸出,亦唔可以用任何方式同其他檔案通訊。不過,程式可以向標準錯誤輸出除錯資訊。

編譯同測試

你可以喺比賽網頁下載一個壓縮檔,入面有用嚟測試程式嘅範例評測程式,亦有你嘅程式嘅範例原始碼檔案。

範例評測程式係 grader.cpp。要測試程式,請將 grader.cpp、conveyor.cpp 同 conveyor.h 放喺同一個目錄,再執行以下指令編譯。你亦可以改為執行壓縮檔入面嘅 compile.sh。

g++ -std=gnu++17 -O2 -o grader grader.cpp conveyor.cpp

編譯成功後,就會產生可執行檔 grader。

留意,正式評測程式同範例評測程式唔同。範例評測程式會以單一行程執行,從標準輸入讀入資料,並向標準輸出寫出結果。

範例評測程式嘅輸入格式

範例評測程式會從標準輸入讀入以下資料。

$$ \begin{gathered} N\\ A_0\quad A_1\quad\cdots\quad A_{N-2}\\ B_0\quad B_1\quad\cdots\quad B_{N-2}\\ C_0\quad C_1\quad\cdots\quad C_{N-2} \end{gathered} $$

對 $0\le i\le N-2$,如果輸送帶 $i$ 將產品由枱 $A_i$ 運去枱 $B_i$,就有 $C_i=0$;否則 $C_i=1$。

範例評測程式嘅輸出格式

範例評測程式會向標準輸出寫出以下資訊(引號只為咗說明)。

  • 如果程式被判為正確,就會用 Accepted: 22 呢個格式報告 Query 嘅呼叫次數。
  • 如果程式被判為任何類型嘅 Wrong Answer,範例評測程式就會用 Wrong Answer [4] 呢個格式寫出錯誤類型。

如果程式符合多種 Wrong Answer 類型,範例評測程式只會報告其中一種。

喺範例評測程式入面,對於放咗產品嘅枱,產品會喺由嗰張枱向外輸送嘅輸送帶之中,均勻隨機揀一條去運送。選擇由偽隨機數決定,唔同次執行嘅結果都唔會改變。要改變偽隨機數嘅種子,可以用以下方式提供第一個整數參數執行範例評測程式。

./grader 2023

評測注意事項

部分測試資料嘅正式評測程式係自適應嘅。即係評測程式一開始唔會有固定答案,而係根據之前 Query 嘅呼叫作出回應。保證至少有一個答案,同評測程式所有回應都唔矛盾。

數據範圍

所有輸入資料都符合以下條件。

  • $0\le A_i\le N-1$ ($0\le i\le N-2$)。
  • $0\le B_i\le N-1$ ($0\le i\le N-2$)。
  • 如果忽略輸送帶嘅方向,任何兩張枱都可以透過若干條輸送帶互相連通。

子任務

  1. (1 分) $N=2$。
  2. (14 分) $N=30$。
  3. (10 分) $N=100\,000$,$A_i=i$ ($0\le i\le N-2$),$B_i=i+1$ ($0\le i\le N-2$)。
  4. (75 分) $N=100\,000$。

樣例

以下係範例評測程式嘅一份輸入,同埋對應嘅函式呼叫。

輸入格式 1

3
0 2
2 1
1 0

範例函式呼叫

函式呼叫 函式呼叫 回傳值
Solve(3, [0, 2], [2, 1])
Query([0, 0], [0, 0, 1]) [1, 0, 0]
Query([1, 0], [1, 0, 1]) [0, 1, 1]
Query([1, 1], [0, 0, 1]) [0, 0, 1]
Query([0, 1], [1, 1, 1]) [1, 0, 1]
Answer([1, 0])

說明

第一次呼叫 Query 時,除咗 [1, 0, 0],另一個可能嘅回傳值係 [0, 1, 0]。

第二次呼叫 Query 時,枱 0 上嘅產品會經輸送帶 0 運去枱 2,然後停低。留意,呢件產品唔會再經輸送帶 1 運去枱 1。

留意,呢份樣例輸入唔符合任何子任務嘅限制。

喺比賽網頁可以取得嘅檔案之中,sample-02.txt 符合子任務 1 嘅限制,而 sample-03.txt 符合子任務 2 嘅限制。

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.