LOJ6669 Nauuo and Binary Tree 题解
Hukaidi8566 · · 个人记录
题目传送门
简要题意:交互题。对于一个有
第一反应要确定每个节点的深度。
这里有一种基于边分治思想的错误做法。
- 如果在以
u 为根的子树内只有一个节点(设为v )的深度为u 的深度加一,则直接确定u 只有唯一一个儿子v ,u 子树内除本身以外的所有节点标记为在以v 为根的子树内,递归处理以v 为根的子树。 - 如果在以
u 为根的子树内有多个节点的深度为u 的深度加一,则这样的节点恰只有两个,记为v_1,v_2 ,询问该子树内除u,v_1,v_2 三个节点以外的节点与v_1 的距离,可以由深度确定其他节点在v_1,v_2 中哪个节点的子树,在递归处理。
这样每个节点大约访问了“深度+子树大小个数”次,时间复杂度
1
/ \
2 3
/ \
4 5
/ \
6 ...
我们反思一下为什么这样询问效率低下。我们询问子树节点与
看来我们需要一种可能的回答有
- 取出一个位于第
i+1 层的节点v ,初始设root 为1 节点。 - 从
root 节点一路往重链走(这里定义重儿子为子孙中第i 层节点较多的儿子),取出一个位于第i 层的节点u ,询问与v 的距离。 - 若距离为
1 或3 ,直接可以确定v 的父亲。否则可以确定u 与v 的lca ,将lca 远离v 的儿子记作root ,容易证明v 在以root 为根的子树内,重复第二步。
在第二步中由于我们每次取重儿子选取
另:相较于前面的错误方案,本方案能够利用更多询问信息,减少询问次数