这道题我们整个机房讨论将近半个小时没有出结果,算法导论都翻了。
突然,有一个同学用十分暴力的并查集A了,于是大家兴奋地都打了暴力。
Sample Input
5 9
0 1 4
1 2 5
0 2 4
0 3 4
1 3 1
0 7 0
0 6 1
0 1 6
1 2 6
Sample Output
0
3
5
我一开始想暴力,直接建树一个一个跳,觉得肯定不对。便觉得没有头绪。后来有一位同学A了,还真是这么暴力!
什么,你说如何快速查询一个点到LCA的最后一个被添加的边?
打LCT?Orz,反正我不打。我们就这么暴力的一个一个跳!
复杂度如何保证?我们可以合并的时候按秩合并,这样深度只有 l o g ( n ) log(n) log(n),暴力跳的时间复杂度自然就只有 O ( l o g ( n ) ) O(log(n)) O(log(n))了!想想就很酷。
蒟蒻代码供嘲讽
#include<cstdio>
using namespace std;
const int N=500010;
int fa[N], v[N], dep