这题太变态了吧。 分析 我们预处理出每个帮派的lca节点,当帮派合并的时候,我们就可以求各个帮派的lca的节点。 假设首都节点是u,各个帮派的lca是pos,分两种情况 当lca(u,pos) != pos的时候,说明u不在pos的子树下,答案就是dis(u,pos)。 当lca(u,pos) == pos的时候,说明u在pos的子树下,首先我们明确一点,对于帮派控制的节点,它与u的lca一定是pos的子节点,我们对每个联盟的帮派求离u最近的dfs序的节点,答案就是dis(u,lca(u,v))。 求最近的dfs序可以利用二分。 #include <bits/stdc++.h&g...