本題為互動題,限用 C++ 作答。你可以在這裡找到範例實作以及範例評分程式,詳細注意事項以及常見問題請參考 Hints。
你遇到了祥子,她手上有一些有根樹,她希望你幫她的樹賦權。
具體來說,祥子會先用深度優先搜索的前序遍歷每一棵樹,並稱第 $i$ 個拜訪到的節點編號為 $i$。接著她會用一個隨機的順序問你每個點,你要再幫每個點賦上一個權重,除了給你點的編號外,她也會給你與該點直接相鄰的點的編號。
有了權重資訊後,祥子會幫樹的每條邊標成黑的或白的,方法如下步驟:
祥子希望對於任兩個點之間的路徑都不能包含超過 $2\lfloor \log_2(N) \rfloor$ 條黑邊,其中 $N$ 是樹的節點數量。請幫幫她完成賦權。
詳細細節與評分方式請見後續段落。
你的程式需要在一開始使用前置處理器引入 lib0913.h,詳細請參考範例實作。
你需要完成以下的兩個函式:
void Init(int N);
Init 會被呼叫恰 $T$ 次。N 代表這棵樹的節點數量。int GetId(int x, std::vector<int> nearby);
GetId 會被呼叫至多 $500\ 000$ 次。Init(N) 後會呼叫恰 $N$ 次 GetId,且保證 $N$ 次傳入的的 x 都不一樣。在這 $N$ 次 GetId 呼叫結束前,不會有任何的 Init 呼叫。x 代表節點的編號,且 $1 \leq x \leq N$。nearby 代表節點 $x$ 的鄰居。Init(N) 與 $N$ 次 GetId 後,評測系統會幫你用題目敘述中描述的方式連邊,你必須要確保連邊後任兩個點的路徑都不能包含超過 $2\lfloor \log_2(N) \rfloor$ 條黑邊。如果任意一個條件沒有被滿足,你的程式會被判斷為 Wrong Answer 並且獲得 0 分,否則,你的程式將依照 Scoring 中的敘述評分。
 
| 評測程式端 | 參賽者程式端 | 
|---|---|
呼叫 Init(8)。 |     |
呼叫 GetId(1, {2})。 |     |
回傳 1。 |   |
呼叫 GetId(3, {2, 4})。 |     |
回傳 3。 |   |
呼叫 GetId(4, {3, 5})。 |     |
回傳 4。 |   |
呼叫 GetId(7, {6, 8})。 |     |
回傳 7。 |   |
呼叫 GetId(6, {5, 7})。 |     |
回傳 6。 |   |
呼叫 GetId(8, {7})。 |     |
回傳 8。 |   |
呼叫 GetId(2, {1, 3})。 |     |
回傳 2。 |   |
呼叫 GetId(5, {4, 6})。 |     |
回傳 5。 |   |
呼叫 Init(4)。 |     |
呼叫 GetId(2, {1})。 |     |
回傳 2。 |   |
呼叫 GetId(1, {2, 3})。 |     |
回傳 1。 |   |
呼叫 GetId(3, {1, 4})。 |     |
回傳 3。 |   |
呼叫 GetId(4, {3})。 |     |
回傳 4。 |   
範例評分程式以下列方式輸入:
$T$ 代表測試資料的數量,$seed$ 代表範例評分程式用於決定 GetId 詢問順序的偽隨機種子。
請注意範例評分程式中決定 GetId 的方式不一定與實際評分所使用的方法相同。
每一筆測試資料中 $p_i$,代表該樹第 $i$ 個節點的父親為 $p_i$。請注意編號為 $1$-based。範例評分程式會幫你按照前序遍歷重新編號,意即:你傳入的樹編號不需為一前序遍歷的結果。
範例評分程式以下列方式輸出:
如果你的程式被判斷為 Accepted,範例評分程式會輸出 Accepted。
如果你的程式被判斷為 Wrong Answer,範例評分程式會輸出 Wrong answer: i to j passes x black edges, limit = y,其中 $i$ 與 $j$ 為兩個沒符合條件的節點,該兩點之間有 $x$ 條黑邊,而限制為 $y$ 條。
另外請注意,範例評分程式的運行效率較慢,若需要更高速的效率請自行修改。
2 1145147122 8 1 2 3 4 5 6 7 4 1 1 3
由於 Windows Defender 以及各種奇怪東西的限制,本題的範例編譯指令不提供 Windows 批次檔。編譯及測試教學請參考下列說明。
ordered-tree.exe,請直接用命令列執行該檔案。-static 參數移除,其餘與 Linux 相同。#include "grader.cpp",並且以單一檔案的編譯執行方式測試,請注意這一行上傳時需要刪除,否則你會獲得一個 Compile Error。
| No. | Testdata Range | Constraints | Score | 
|---|---|---|---|
| 1 | 0 | 範例測資 | 0 | 
| 2 | 0~30 | 無額外限制 | 100 |