[USACO 18Jan Gold] Moo Tube

纵饮孤独 提交于 2020-01-07 09:49:22

题目大意:

  给定一棵节点数为n的树,每两点之间的关联度为两点路径上权值最小的边。q次查询,每次查询某个点关联度大于等于k的节点的数量。

  n,q<=100,000

题目解法:

  数据范围考虑排序后离线操作。

  显然,对于每个点,符合条件的节点一定是一个包含该点的连通块。因此我们可以考虑每次操作将所有权值>=k的边的两个端点合并到同一个连通块(通过并查集实现),然后再用一个数组记录每个连通块的大小,对于每次查询输出该点所在连通块大小即可。为了降低合并操作的复杂度,我们考虑到如果将所有操作按照k从大到小排序,我们只需要在前面的基础上合并新的边即可。这样总的合并次数就是边数。为了更快的找到需要新加的边,还需要把边按照权值排序,这样找边的复杂度也是边数。总的复杂度是O(n log n)

  

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!