考试想到了正解然而并没有什么卵用(当然不是dfs)
做法稍有不同我用的是并查集
因为这题比较容易看出来并查集大概可做
考虑并查集特点:只能查询总父亲,判断是否在一个集合内;
那么我们只能离线来做。否则只能判断集合不能判断父子关系
考虑正确性:发现并和交没有关系(就算有关系对于某个点来说我们也只会可能是同级关系不会产生父子关系),这样我们可以分开
用两种并查集一种维护并操作另一种交操作。
我们只在新加入这个点(即它合成时处理和它相关操作即可),对于询问x,y;
我们处理两个里比较大的 : y大说明它是并出来的(假设它是因为被合并当了父亲的话就不是最大的了),说明我们在并的并查集中去解决它即可;
同理:x大说明它是交出来的,我们放入交中的query去解决,注意的是要翻转一下并查集中的父子关系,使交出来的儿子去当集合中的父亲。。。
K=1,合同交,我们在并和交的离线操作中均去解决保证他们都当了一次另一个节点的父亲。。。
复杂度因为最多把用来融合的元素都扫了一遍,并查集加路径压缩均摊总的大概是On的 所以大概是o(n)的或者与M有关大概是这个样子总之复杂度不会超掉