luogu#P11354. [eJOI 2023] Tree Search
[eJOI 2023] Tree Search
题目背景
本题对洛谷交互格式进行了适配,你可以在以下代码的基础上进行实现:
#include<bits/stdc++.h>
using namespace std;
extern "C" bool ask(int x);
extern "C" int solve(int n,vector<int> p)
{
assert(ask(1)==1);
return 20080520;
}
题目描述
这是一道交互题。
给定一棵 个点的有根二叉树 ,保证根结点的编号为 。
树上恰有一个未知的结点是特殊的,你需要找出这个结点。
你每次可以向交互库询问一棵子树中是否含有特殊结点,你可以询问至多 次。
【实现细节】
你需要实现下列函数:
int solve(int N, std::vector < int > p)
- :树的结点数量。
- :长度为 的数组,描述树的形态。第 个元素 满足 ,代表编号为 的结点的父亲编号。
- 中的元素两两不同。
- 你需要返回特殊结点的编号。
- 这个函数只会被调用恰好一次。
你可以调用以下函数:
int ask(int x)
- :询问的子树根结点编号。
- 你需要保证 。
- 如果子树包含特殊结点,返回值为 ,否则为 。
输入格式
以下为下发 grader 的输入格式,你不应该从标准输入中读入任何信息。
第一行输入一个整数 。
第二行输入 个整数 。
接下来对于每个询问,输入一个整数代表询问的返回值。
输出格式
以下为下发 grader 的输出格式,你不应该向标准输出中打印任何信息。
对于每个询问,输出一行 ? x
,其中 为询问的结点。
最后输出一行 ! x
,其中 为猜测的结点编号。
5
1 1 2 4
1
0
? 4
? 5
! 4
提示
【数据范围】
本题采用捆绑测试。
- Subtask 1(20 pts):。
- Subtask 2(30 pts):。
- Subtask 3(15 pts):。
- Subtask 4(35 pts):无特殊限制。
对于 的数据,保证 。