题目链接: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]=\dfrac{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 |
|