Codeforces Round 446 (Div. 1)
C大意
给一个有权无向图。进行q次询问,第i次询问ki个边,问所提到的ki个边能否同时出现在图的最小生成树上,返回YES或NO。
数据范围
图的边和点<=500'000
询问数q<=500'000
,所有询问的边数的和sum(ki)<=500'000
时间空间(2s/256MB)
题解
不知道如果当时继续想下去,会不会想出解法,当时已经想到 并查集 和 边+未选取的边形成的环,已选取的 不能 大于max(未选取的)。感觉和正解的具体实现还差很远,但基础结论已经有了
标答说成那样,我也是没啥办法,我也想到了,没想到下一步。然后观摩了moejy0viiiiiv大佬的代码。 下面用举例来说明
首先,不要用官方的样例来想,想象图有且只有一个环,环上的边长是1,1,2,2,2
很直接可以知道只要不是选了所有的2,那么 都是可以同时存在于一个MST上的,那么选三个2的情况发生了什么,也就是上面说的选了三个2以后,在这个环上,未选取的最大只是1了。然后换一个角度看,如果我们已经先把图上所有的长度为1的链接好了,那么在新增加2的时候,就不应该形成环。
同样可以想象环上是1,1,2,2,2,3的情况,现在 尝试添加2的时候,就算全添加了,也不会直接形成环,和结论全选了2也能同时存在于一个MST是一样的。
其中要注意的是对于第一种情况,就算 询问中没有1 1,也不能选取 所有的2
因此把上述方法转化为伪代码
1 | 首先读入,所有边和询问,将询问 每个拆分,按长度第一序,询问号第二序 排序 |
整理上面成循环就是
1 | i=0 |
上面代码中 一个是既要利用已经连接的小于length的并查集,又要在每次 进行成环检测时 并查集能够复用,具体实现见下面moejy0viiiiiv大佬的代码,他用f来实现 可以逐渐增加利用的并查集,用p和mt来实现可复用 的每次检测。
代码
1 |
|