我们只需要把所有01串按照第一位大小分类,然后把其中一类建成一棵字典树,再把第二类的每个数字丢进字典树里暴力查找,寻找第一位不同的两堆树连一条边的最小权值,把这个值累加进答案,再分治处理每类数即可。
因为一共需要处理\(\log n\)次,每次处理\(n\)个数,处理每个数复杂度为\(\log n\)。总复杂度\(O(n\log ^2n)\)
代码:
#include#include #include #include #include #include #define ll long long#define maxn 200500#define node vector using namespace std;int n,ch[maxn*20][2],ori[maxn],tot;void insert(int num) { int p=30,now=0; while(p>=0) { int digit=0; if((1< =0) { int digit=0; if(num&(1<