codeforces round260 div1C&div2E Civilization 并查集+树的直径

来源:互联网 发布:spss软件官网 编辑:程序博客网 时间:2024/05/18 20:33

题目链接点这儿

给你一个森林。有两种操作,

1° 将两棵树已某种方式合并起来,让新树的直径最小。

2° 查询某个点所在树的直径是多少。


让新树的直径最小的话,明显从两个直径中点处连一条新边最好,因为这样可以保证从一棵树的直径的任意端点到另一棵树的直径的任意端点的距离最小。然后新树的直径d则是从两棵树的直径d1,d2以及从一棵树到另一棵树的最远距离(d1+1)/2+(d2+1)/2+1三者中取最大的。


合并操作用并查集维护,求初始的树的直径用两边dfs处理

代码在这儿

0 0