#L3656. 「2021 集训队互测」Tree
「2021 集训队互测」Tree
题目描述
这是一道交互题。
有一棵 个节点的以 为根的树,你每次可以询问集合 ,令 表示 子树内的点, 表示 到 路径上的边数,交互库会返回:
$$\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} $$如果你返回的树和交互库同构,你将获得 的分数。
实现细节
你需要实现 std::vector<int> solve(int n); 其中 是节点数,返回的 vector 里面依次存储 的父亲节点。
注意:不保证父亲节点编号小于子节点。
你可以使用 int query(std::vector<int> T); 来询问,意义如上。
正式评测时交互库仅添加防作弊措施,运行效率与下发文件相同。
本地测试时,交互库读入为:第一行一个整数 ,第二行 个整数分别表示 的父亲。
样例
输入
6
1 2 3 1 2
询问:
query({1}) = 31query({3, 5}) = 8query({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
数据范围与提示
,下面 表示你询问次数的上界。
特殊性质:
- A:这是一棵二叉树
- B:树随机,随机方式为:随机生成一个排列 ,满足 ,然后令 在 内随机生成
| 分数 | 特殊性质 | ||
|---|---|---|---|
| 5 | 1 000 | 5 | |
| 100 | |||
| 5 000 | 10 | ||
| 1 000 | |||
| A | |||
| B | |||
| A | |||
| B | |||