维护两个并查集。我们遍历 1 ~ n,对第一个并查集:对于从 i 连出的每条边,只将另一端小于等于 i 的边生效,之后判断当前并查集的大小是否等于 i,否的话输出 -1。对于第二个并查集:我们 i 能连到的所有节点插入并查集,那么当前并查集中就是 1 ~ i 的连通块以及与这个连通块直接相连的节点,我们用这个并查集的大小减掉 i 就是答案。
ABC 401 F
思路蛮简单,今天脑袋有点晕,调了好长时间,个人认为思维难度不如 E,甚至不如 D。
很容易想到对于每一个(i, j),其对答案的贡献是 max(i 到其树中最远位置的距离 + j 到其树中最远位置的距离 + 1, i 树直径, j 树直径)。目前难以处理的点是 n1 和 n2 都是 2e5 级别,盲目暴力相加只会超时。目前我们已经有了两个距离数组,存储着两棵树中的每一个点在其树中能到的最远距离,对于这种需要遍历过所有 (i, j) 数对的问题,常见的解决方法是前缀和,我们维护两个距离数组的前缀和,并且遍历那个整棵树直径更小的树的距离数组(因为前面的 max 式可以发现永远不会取其直径),我们遍历 i 节点时,只需要二分找到取树直径和取距离相加的分界线即可。
posted on
2025-04-18 15:08wuhu12345
阅读(6)
评论(0)
收藏举报