#P11946. [KTSC 2025] 信竞天择 2 / evolution

    ID: 13338 远端评测题 3000ms 2048MiB 尝试: 0 已通过: 0 难度: 7 上传者: 标签>2025交互题Special JudgeKOI(韩国)

[KTSC 2025] 信竞天择 2 / evolution

题目背景

版权信息:译自 2025年度 国际情报 올림피아드 (Olympiad) 代表学生 选拔考试 R2T1。[CC BY-NC-SA 4.0]


你需要在文件头添加以下内容:

int compare(int u, int v);

题目描述

这是一道交互题。交互库是非自适应(non-adaptive)的。

有一棵 nn 个节点的有根树,节点编号 0n10\sim n-1。根是点 00

点有点权。点 ii 的点权为 pip_ipip_i 构成 0n10\sim n-1 的排列。

pip_i 满足两点特殊性质:

  • 保证 p0=0\textcolor{red}{\bf{p_0=0}}
  • uuvv 的父亲,则 pu<pvp_u\lt p_v

但是你不知道 pip_i 具体是多少,只知道树的形态。你可以多次询问:

询问 给定 u,vu,v0u,v<n0\le u,v\lt nuvu\neq v)。

  • pu<pvp_u\lt p_v,回答为 11
  • pu>pvp_u\gt p_v,回答为 00

试利用询问找出点权。

实现细节

你不需要,也不应该实现 main 函数。

你需要在文件头添加以下内容:

int compare(int u, int v);

你可以调用以下的函数:

int compare(int u, int v);
  • 参数 u,vu,v 满足 0u,v<n0\le u,v\lt n,且 uvu\neq v
  • pu<pvp_u\lt p_v,返回值为 11;否则返回值为 00

你应当实现以下的函数:

std::vector<int> recover(int n, std::vector<int> U, std::vector<int> V);

recover 函数将被调用多次(多组数据)。

  • nn:树的节点数量。
  • U,VU,V:长度为 (n1)(n-1) 的数组。0i<n1\forall 0\le i\lt n-1UiU_iViV_i 的父亲。
  • 返回一个长度为 nn 的排列 pp,表示每个点的点权。

输入格式

注意特殊的输入格式。

本题单个测试点内有多组测试数据。

Sample Grader 输入格式如下:

第一行,一个正整数 TT,表示数据组数。

接下来描述 TT 组数据。

每组数据第一行,一个正整数 nn

每组数据第二行,(n1)(n-1) 个非负整数 f1,f2,,fn1f_1,f_2,\ldots,f_{n-1}。保证 0fi<i0\le f_i\lt i

每组数据第三行,nn 个非负整数 q0,q1,,qn1q_0,q_1,\ldots,q_{n-1}qq 是一个排列。q0=0q_0=0

输入的含义为:1i<n\forall 1\le i\lt n,点 qfiq_{f_i} 是点 qiq_i 的父亲。点 qiq_i 的点权为 ii

输出格式

Sample Grader 输出格式如下:

对于每组数据,

  • 如果调用的 compare(u,v) 不满足 0u,vn10 \leq u, v \leq n - 1,则输出一行 Wrong Answer [1]
  • 如果调用的 compare(u,v) 不满足 uvu \neq v,则输出一行 Wrong Answer [2]
  • 如果 recover 函数返回的数组大小不是 nn,则输出一行 Wrong Answer [3]
  • 否则,第一行输出 compare 函数的总调用次数 CC,格式为 C : 4,然后在下一行按顺序输出 recover 函数返回的数组 pp 的元素。

当输出 Wrong Answer 时,Sample Grader 将立刻终止。

注意,Sample Grader 不会验证答案。

答案正确,当且仅当 0i<n\forall 0 \leq i \lt n,都有 qpi=iq_{p_i}=i

提示

计分方式

设有 PP 个对应的排列符合树形态的限制。PP 显然是正整数。

Z=log2PZ=\lceil \log_2 P\rceilCC 为单组数据内调用 compare 函数的次数。

  • Z0Z\neq 0 时,定义 K=C/ZK=C/Z
  • Z=0Z=0 时,若 C=0C=0,规定 K=0K=0;否则规定 K=2025K=2\, 025

单组数据的得分率如下所示:

$$\mathrm{rate}= \begin{cases} 0, & K\in (20,+\infty) \\ 0.01(5\cdot \frac{20-K}{12}+5), & K\in (8,20] \\ 0.01(50\cdot \frac{8-K}{5.5}+10), & K\in (2.5,8] \\ 0.01(20\cdot (2.5-K)+60), & K\in (1.5,2.5] \\ 0.01(10\cdot \frac{1.5-K}{0.1}+80), & K\in (1.4,1.5] \\ 1.00, & K\in [0,1.4] \end{cases} $$

单组数据得分等于 rate\mathrm{rate} 乘以子任务得分。

单个测试点得分为每组数据得分的最小值,向下取整。

子任务得分为测试点得分最小值。

样例交互

样例交互 11

n=4n=4U=[0,0,0]U=[0,0,0]V=[1,2,3]V=[1,2,3]。树的形态如图所示。

交互库调用

recover(4, [0, 0, 0], [1, 2, 3]);

显然有 66 个可能的排列 pp

$$[0, 1, 2, 3], [0, 1, 3, 2], [0, 2, 1, 3], [0, 2, 3, 1],[0, 3, 1, 2], [0, 3, 2, 1] $$

所以,P=6P=6Z=3Z=3

随后进行了四次询问,结果如下:

  • 调用 compare(1,2),结果为 p1<p2p_1 < p_2,返回值为 11
  • 调用 compare(2,3),结果为 p2>p3p_2 > p_3,返回值为 00
  • 调用 compare(1,3),结果为 p1>p3p_1 > p_3,返回值为 00
  • 调用 compare(0,3),结果为 p0<p3p_0 < p_3,返回值为 11

由询问的信息,可以确定排列 p=[0,2,3,1]p=[0,2,3,1]

此时,C=4C=4K=C/Z=4/31.4K=C/Z=4/3\le 1.4,可以获得该测试点的满分。

数据范围

  • 2n,n1042\le n,\sum n\le 10^4
  • 0Ui<n0\le U_i\lt n0<Vi<n0\lt V_i\lt nUiViU_i\neq V_i
  • p0=0p_0=0
  • uuvv 的父亲,则 pu<pvp_u\lt p_v

子任务

  • Subtask 1 (1 pts)\text{Subtask 1 (1 pts)}
    • 每个点度数至多为 2\textcolor{red}{\textbf{2}};点 00 度数为 11
  • Subtask 2 (7 pts)\text{Subtask 2 (7 pts)}
    • 0i<n1,Ui=0\forall 0\le i\lt n-1,U_i=0
  • Subtask 3 (12 pts)\text{Subtask 3 (12 pts)}
    • 树的形态是满二叉树(perfect binary tree)。
  • Subtask 4 (80 pts)\text{Subtask 4 (80 pts)}:无额外约束。