这是一个交互式问题!
Antonio 在他的城市 Barlad 因赢得上一届 JBOI(仅限初中生的竞赛)而闻名。由于他现在是一名高中生,他想向他最好的朋友 Zetul 展示他也能解决更难的问题。
为了做到这一点,Zetul 在家乡的一个美丽公园——公共花园里藏了一枚复活节彩蛋。公共花园包含 $N$ 个岛屿,由 $N-1$ 座桥梁连接,使得这 $N$ 个岛屿组成的集合是“美丽的”。
现在,Antonio 需要通过向 Zetul 提出若干问题来找到复活节彩蛋:Antonio 会给 Zetul 一组岛屿,Zetul 会告诉他彩蛋是否隐藏在这一组岛屿中。Zetul 提出的唯一条件是这组岛屿必须是“美丽的”。如果一组岛屿中任意两个岛屿之间都有桥梁相连,那么这组岛屿就是美丽的。更准确地说,集合中任意两个岛屿之间都存在一条由桥梁构成的路径。
你需要帮助 Antonio 找到复活节彩蛋,并尽可能少地使用提问次数,以向 Zetul 展示 Antonio 也能解决高中水平的问题!
在一个测试用例中,至少会隐藏一枚复活节彩蛋,因此请确保你的程序支持多次查找复活节彩蛋。一个测试用例中最多会有 60 次 findEgg 调用,时间限制适用于所有这些调用。
任务
你需要实现一个函数 findEgg 来确定复活节彩蛋隐藏在哪个岛屿上。
findEgg(N, bridges)N: 岛屿的数量。bridges: 长度为 $N-1$ 的向量;它包含 $N-1$ 对岛屿,使得每一对岛屿之间都有一座桥梁相连。
你可以调用函数 query 来帮助你找到复活节彩蛋。如果彩蛋在 query 提供的岛屿集合中,该函数将返回 1,否则返回 0。
query(islands)islands: 整数向量;这是 Antonio 给 Zetul 的岛屿集合(别忘了岛屿集合必须是美丽的)。
子任务
$Q$ 是你的程序为寻找一枚彩蛋所调用的查询次数。
| 子任务 | $N$ | 分值 | 得分比例 |
|---|---|---|---|
| 1 | $N \le 16$ | 30 | 100%, $0 \le Q \le 4$ 80%, $5 \le Q \le 6$ 66%, $7 \le Q \le 10$ 40%, $11 \le Q \le 14$ 25%, $Q = 15$ 15%, $Q = 16$ |
| 2 | $N \le 500$ | 40 | 100%, $0 \le Q \le 9$ 85%, $10 \le Q \le 11$ 66%, $12 \le Q \le 45$ |
| 3 | $N = 512$ | 30 | 100%, $0 \le Q \le 9$ 75%, $10 \le Q \le 11$ 66%, $12 \le Q \le 45$ |
实现细节
你必须提交一个 cpp 文件。该文件需实现上述的 findEgg 函数(不需要 main 函数)。
int findEgg(int N, vector < pair < int, int > > bridges);
query 的函数签名如下:
int query(vector < int > islands);
样例
对于 $N = 5$,桥梁为:(1, 2), (1, 3), (2, 4), (4, 5)。
集合 $\{1, 2, 3\}$ 是美丽的。集合 $\{1, 2, 4, 5\}$ 是美丽的。集合 $\{1, 2, 3, 5\}$ 不是美丽的(岛屿编号从 1 开始)。