思路:

对于每一个查询,我们需要找到两只毛毛虫可能走到的节点。首先,我们可以使用深度优先搜索(DFS)来遍历整个树,找到每个节点的深度。然后,对于每一个查询,我们可以找到a和b的最近公共祖先节点(LCA),并根据a和b的深度来确定两只毛毛虫可能走到的节点。

具体步骤如下:

  1. 构建树的邻接表表示。对于每个节点i,将与其相连的节点fi加入到i的邻接表中。

  2. 使用DFS遍历整个树,找到每个节点的深度。定义一个depth数组,depth[i]表示节点i的深度。初始时,将根节点1的深度设置为0。对于每个节点i的邻居节点j,如果depth[j]还未被计算,那么将depth[j]设置为depth[i]+1,并递归调用DFS(j)。

  3. 对于每一个查询,找到a和b的最近公共祖先节点。定义一个lca函数来计算最近公共祖先。首先,如果a和b相等,那么它们的最近公共祖先就是它们自己。如果a和b的深度不相等,那么我们将较深的节点向上移动,直到它们的深度相等。然后,我们同时向上移动a和b,直到它们相等,这时候它们就是最近公共祖先节点。

  4. 根据a和b的深度来确定两只毛毛虫可能走到的节点。我们可以分为三种情况来讨论:

    • 如果a和b的深度相等,那么两只毛毛虫可能走到的节点就是它们的最近公共祖先节点。

    • 如果a的深度大于b的深度,那么a可能走到的节点是a的子节点,b可能走到的节点是a的祖先节点(包括a本身)。

    • 如果a的深度小于b的深度,那么a可能走到的节点是b的祖先节点(包括b本身),b可能走到的节点是b的子节点。

  5. 对于每一个查询,计算两只毛毛虫可能走到的节点的个数。分别记为cnt1和cnt2。对于每个节点i,如果i是a可能走到的节点,则cnt1加上1;如果i是b可能走到的节点,则cnt2加上1。

  6. 将cnt1和cnt2的异或和作为答案,并输出


原文地址: http://www.cveoy.top/t/topic/iyUP 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录