题解
膜一发启发式合并
启发式合并从前我都只在并查集上用到过,但今天是在这种上面…
这道题的做法非常暴力:直接对每一个颜色节点构建链式前向星,然后合并的时候短链合并到长链上。
为什么这么做是对的呢?因为短链合并之后最少比原来要长一倍,所以合并起来最多合并$logn$次,这样均摊总时间复杂度就是$O(nlogn)$。
感觉这种思想跟线段数的区间开方的分析有着异曲同工之妙…
有一个细节:要记录合并时操作的真正颜色,因为短合长或者长合短在程序操作上是等价的,但颜色是不等价的。
1 |
|
膜一发启发式合并
启发式合并从前我都只在并查集上用到过,但今天是在这种上面…
这道题的做法非常暴力:直接对每一个颜色节点构建链式前向星,然后合并的时候短链合并到长链上。
为什么这么做是对的呢?因为短链合并之后最少比原来要长一倍,所以合并起来最多合并$logn$次,这样均摊总时间复杂度就是$O(nlogn)$。
感觉这种思想跟线段数的区间开方的分析有着异曲同工之妙…
有一个细节:要记录合并时操作的真正颜色,因为短合长或者长合短在程序操作上是等价的,但颜色是不等价的。
1 | #include <cstdio> |
v1.5.2