TopCoder

8e7

User's AC Ratio

38.5% (5/13)

Submission's AC Ratio

10.3% (12/117)

Tags

Description

本題為互動題,限用 C++ 作答。你可以在這裡找到範例實作以及範例評分程式,詳細注意事項以及常見問題請參考 Hints。

熟知世界各地的植被,而在地理遊戲「Geoguessr」大賽獲得冠軍的你,最近想要有個新的挑戰。於是你決定玩現在最新的解謎遊戲:Treeguessr!這個遊戲一開始有一個未知的樹 $T$,而玩家的目標就是要知道樹的長相。

每個回合,玩家可以在某些節點放下訊號源,並且在回合結束之前移動到某個地方。當回合結束時,玩家會拿起感測器,並且測得最近的訊號源與玩家自身位置的距離。下一回合開始時,訊號源會全部消失,玩家就會重複上面的操作,直到猜出整棵樹為止。

具體來說,玩家每個回合可以詢問 $\textrm{query}(p, S)$,其中 $p$ 是玩家所在的節點編號,$S$ 是訊號源的節點編號集合,而玩家會得到
$$\textrm{query}(p, S) = \min_{s \in S} \left(\textrm{dis}(p, s)\right)$$
其中 $\textrm{dis}(p, s)$ 是 $p$ 跟 $s$ 的距離。

在這個遊戲中,回合數用的越少,分數就越高。請在最少的回合數內判斷出 $T$,贏得 Treeguessr 的勝利!

詳細細節與評分方式請見後續段落。

Implementation Details

本題請不要使用標準輸入輸出流,不過你仍然可以輸出除錯訊息至標準錯誤流(stderr)。

你的程式需要在一開始使用前置處理器引入 lib0906.h,詳細請參考範例實作。

你需要完成以下的一個函式:

std::vector<std::pair<int, int>> treeguessr(int n);
  • 在一筆測試資料中,treeguessr 會被呼叫恰一次。
  • n 為遊戲中樹的節點數。
  • 節點的編號為 $1, 2, \ldots, n$。
  • 回傳值必須為一個長度為 $n - 1$ 的陣列,其中若第 $i$ 項為 $(u_i, v_i)$,則代表樹 $T$ 的第 $i$ 條邊連接節點 $u_i$ 與節點 $v_i$。邊可以用任意順序輸出。

你可以呼叫以下函式:

int query(int p, std::vector<int> S);
  • 引數 $p$ 需滿足 $1 \leq p \leq n$。
  • 引數 $S$ 需滿足 $|S| > 0$ 且 $\forall s \in S, 1 \leq s \leq n$。
  • 回傳值是一個整數,表示 $\textrm{query}(p, S)$ 的值。
  • query 不得被呼叫超過 $\textbf{2\ 000\ 000}$ 次

如果任意一個條件沒有被滿足,你的程式會被判斷為 Wrong Answer 並且獲得 0 分,否則,你的程式將依照 Scoring 中的敘述評分。

Example

假設 $n = 4$,一個被判斷為 Accepted 的範例互動狀況如下:


評測程式端 參賽者程式端
呼叫 treeguessr(4)
呼叫 query(1, {4})
回傳 2
呼叫 query(2, {1, 4})
回傳 1
呼叫 query(3, {1})
回傳 1
呼叫 query(4, {1, 2})
回傳 2
回傳 {{1, 2}, {1, 3}, {3, 4}}

Constraints

  • $2 \leq n \leq 1500$
  • 樹 $T$ 不會隨著互動過程而改變。

Scoring

假設在所有測試資料中,你呼叫 query 的次數最大值為 $q$,你的得分會是該子題的得分乘上倍數 $p$,由下列方式計算:

  • 如果 $q \leq 10\ 100$, $$p = 1$$
  • 否則, $$p = \frac{10\ 100}{q}$$

Input Format

範例評分程式以下列方式輸入:

  • line $1$: $n$
  • line $2+i (0\leq i < n - 1)$: $u_i$ $v_i$

Output Format

範例評分程式以下列方式輸出:

如果你的程式被判斷為 Accepted,範例評分程式會輸出 Accepted: q,其中 q 為呼叫 query 的次數。接著輸出 $n - 1$ 行,第 $i$ 行有兩個整數 $u_i, v_i$ 代表你回傳的第 $i$ 條邊連接的點。

如果你的程式被判斷為 Wrong Answer,範例評分程式會輸出 Wrong Answer: MSG,其中 MSG 以及其代表的意思為以下列表的其中一個:

  • p must be between 1 and n: query 函式傳入的 $p$ 不在 $1$ 至 $n$ 的範圍內。
  • S must be nonempty: query 函式傳入的 $S$ 為空。
  • elements in S must be between 1 and n: query 函式傳入的 $S$ 內有不在 $1$ 至 $n$ 範圍內的數。
  • Too many queries: query 的呼叫次數過多。
  • invalid answer:回傳的陣列長度不是 $n - 1$。

如果有多個原因,範例評分程式只會輸出任何一個。

另外請注意,範例評分程式並不會幫你檢查你回傳的數值是否是正確的。

Sample Input 1

4
1 2
1 3
3 4

Sample Output 1


        

Hints

由於 Windows Defender 以及各種奇怪東西的限制,本題的範例編譯指令不提供 Windows 批次檔。編譯及測試教學請參考下列說明。

  • 如果你的系統是 Linux,你可以直接執行 compile.sh 編譯你的程式,編譯結果會是 treeguessr.exe,請直接用命令列執行該檔案。
  • 如果你的系統是 MacOS,你需要將 compile.sh 當中的 -static 參數移除,其餘與 Linux 相同。
  • 如果你的系統是 Windows,你有以下的選擇:
    1. 本地測試時加入 #include "grader.cpp",並且以單一檔案的編譯執行方式測試,請注意這一行上傳時需要刪除,否則你會獲得一個 Compile Error。
    2. 將 compile.sh 的變數替換後直接於命令列執行,請注意你需要確保 g++ 在系統的環境變數 PATH 中。
    3. 如果你的電腦已經有 WSL (Windows Subsystem for Linux),你可以直接使用 WSL 並按照 Linux 的做法。
    4. 使用電腦教室的 Ubuntu(啟動時可以選擇系統)並按照 Linux 的做法。

Problem Source

Subtasks

No. Testdata Range Constraints Score
1 0 範例測資 0
2 0~18 所有點與節點 $1$ 的距離不超過 $2$ 25
3 0~48 無額外限制 75

Testdata and Limits

No. Time Limit (ms) Memory Limit (VSS, KiB) Output Limit (KiB) Subtasks
0 2000 262144 65536 1 2 3
1 2000 262144 65536 2 3
2 2000 262144 65536 2 3
3 2000 262144 65536 2 3
4 2000 262144 65536 2 3
5 2000 262144 65536 2 3
6 2000 262144 65536 2 3
7 2000 262144 65536 2 3
8 2000 262144 65536 2 3
9 2000 262144 65536 2 3
10 2000 262144 65536 2 3
11 2000 262144 65536 2 3
12 2000 262144 65536 2 3
13 2000 262144 65536 2 3
14 2000 262144 65536 2 3
15 2000 262144 65536 2 3
16 2000 262144 65536 2 3
17 2000 262144 65536 2 3
18 2000 262144 65536 2 3
19 2000 262144 65536 3
20 2000 262144 65536 3
21 2000 262144 65536 3
22 2000 262144 65536 3
23 2000 262144 65536 3
24 2000 262144 65536 3
25 2000 262144 65536 3
26 2000 262144 65536 3
27 2000 262144 65536 3
28 2000 262144 65536 3
29 2000 262144 65536 3
30 2000 262144 65536 3
31 2000 262144 65536 3
32 2000 262144 65536 3
33 2000 262144 65536 3
34 2000 262144 65536 3
35 2000 262144 65536 3
36 2000 262144 65536 3
37 2000 262144 65536 3
38 2000 262144 65536 3
39 2000 262144 65536 3
40 2000 262144 65536 3
41 2000 262144 65536 3
42 2000 262144 65536 3
43 2000 262144 65536 3
44 2000 262144 65536 3
45 2000 262144 65536 3
46 2000 262144 65536 3
47 2000 262144 65536 3
48 2000 262144 65536 3