#HK3656. 「2021 集训队互测」Tree

「2021 集训队互测」Tree

题目描述

这是一道交互题。

有一棵 nn 个节点的以 11 为根的树,你每次可以询问集合 TT,令 SuS_u 表示 uu 子树内的点,d(u,v)d(u,v) 表示 uuvv 路径上的边数,交互库会返回:

$$\begin{aligned} V&=\{x \mid \exists u\in T,x\in S_u\}\\ D(T)&=\sum_{i\in V,j\in V,i < j}d(i,j) \end{aligned} $$

如果你返回的树和交互库同构,你将获得 40%40\% 的分数。

实现细节

你需要实现 std::vector<int> solve(int n); 其中 nn 是节点数,返回的 vector 里面依次存储 2n2\sim n 的父亲节点,注意:不保证父亲节点编号小于子节点。

你可以使用 int query(std::vector<int> T); 来询问,意义如上。

正式评测时交互库仅添加防作弊措施,运行效率与下发文件相同。

本地测试时,交互库读入为:第一行一个整数 nn,第二行 n1n-1 个整数分别表示 2n2\sim n 的父亲。

6
1 2 3 1 2

询问:

query({1})=31
query({3,5})=8
query({3})=1

返回:

{1,2,3,1,2}:  score=1.0
{1,2,3,2,1}:  score=0.4
{1,1,1,1,1}:  score=0.0

数据范围与提示

n1000n\leq 1000,下面 TT 表示你询问次数的上界。

  • A 特殊性质满足:这是一棵二叉树。
  • B 特殊性质满足:树随机,随机方式为:随机生成一个排列 pp,满足 p1=1p_1=1,然后令 fpif_{p_i}p1i1p_{1\sim i-1} 内随机生成。
nn TT 分数 特殊性质
55 10001\,000 55
100100 10510^5 55
50005\,000 1010
10001\,000 2×1052 \times 10^5 1010
10510^5 1010 A
1010 B
1010
5×1045 \times 10^4 1010 A
1010 B
1010
3×1043 \times 10^4 1010