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

IOICamp 2025 Day2 pF

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