建通道【思维异或lowbit最小生成树XOR_MST】【2020牛客寒假算法基础集训营2】
也就是说,我们贪心的来想,肯定是先要让相同值的元素先建边,然后再是选择lowbit(x) == 1的,然后再是2的,再是4的以此类推,那么贪心的思维就出来了。 然后咋一看,是 的做法啊!怎么优化? 我们肯定是要0和1进行合并的,每一位的0、1进行合并,是为了贪心的考虑,所以说,我们从并查集的角度来看,不妨先是0中的第一个元素去合并完1中的所有元素,然后保留一个1中的元素,继续,把0后面的所有元素去看能不能和1中的这一个元素进行合并来是的复杂度变成 。 #include <iostream> #include <cstdio> #include <cmath> #include <string> #include <cstring> #include <algorithm> #include <limits> #include <vector> #include <stack> #include <queue> #include <set> #include <map> #include <bitset> #include <unordered_map> #include <unordered_set> #define lowbit(x) ( x&(-x) ) #define pi 3.141592653589793 #define e 2.718281828459045