题目链接:https://codeforces.com/contest/1174/problem/F
题意:给一棵n个点的树,根节点为1。并且后台确定了一个点x,现在给你两种可以使用的查询操作:
d u:后台会返回u和x的距离
s u:后台返回u到x的下一个点的id,如果u不是x的祖先会报错。
允许询问36次,让你确定x的序号。
首先可以肯定我们使用d 1可以知道x的深度,记为dep[x].
假设我们已知某点v,那么通过1操作我们可以知道x和v的距离dis(x,v),如果我们预处理所有点的深度dep[i],并且假设LCA(x,v)=y,那么我们可以知道:
dep[y]=dep[x]+dep[v]−dis(x,v)2
于是我们可以用v点往上找dep[v]−dep[y]个点就能找到y,可以用树链剖分:预处理每个点的子孙数,深度、重链的儿子,每次在重链上查询,于是查询的点y就是点u的重链上的第dep[y]−dep[u]个孩子。于是每次拿查询到的y作为根继续查它的重链,直到y和x在同一条链上,那么下一步查询x和y就会重合。
1 |
|
v1.5.2