B - Graph
- 每次操作不会改变两点之间的路径异或和
- 以 1 号点为起点,算出任意一点到 1 号点的异或值 dis[i](把该值当做 i 号点权值), 那么任意两点的异或值为 (dis[i]~xor~ dis[j]),该值也是 i, j两点的边权。
- 计算xor最小生成树即可(模版题),具体来说,将每个点的权值二进制表示后,优先考虑高bit位,分成两组,组内递归解决子问题,组与组之间要找两个异或结果最小的点连边(可以用Trie在O(n*30)实现)。
为什么可以这么做,因为优先考虑了高bit位,比如说我们考虑了第29位,将第29位是1的点分为一组,另外的点分为一组,组与组之间只会连一个边,该边是整个图里面唯一一条含有 (2^{29}) 的一条边。如果不这么做,那么一定不止有一条含有(2^{29}) 的边。
复杂度(O(30*nlog n)),不到1e8
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
#define dbg(x...) do { cout << "