G. Xor-MST(边权为俩点值的异或值,求MST)

题:https://codeforces.com/problemset/problem/888/G

模板题

#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define MP make_pair
typedef long long ll;
const int mod=1e9+7;
const int M=2e5+5;
const int inf=0x3f3f3f3f;
const ll INF=1e18;
int a[M],trie[M*32][2];
int pos[M*32];
vector<int>v[M];
int tot=1;
ll ans=0;
void pn(){
    cout<<"NO"<<'
';
}
void py(){
    cout<<"YES"<<'
';
}
void add(int x,int id){
    int now=1;
    for(int i=30;i>=0;i--){
        if(!trie[now][(1&(x>>i))])
            trie[now][(1&(x>>i))]=++tot;
        now=trie[now][(1&(x>>i))];
    }
    pos[now]=id;
    v[id].pb(x);
}
ll query(int x,int rt,int dep){
    ll res=1<<dep;
    for(int i=dep-1;i>=0;i--){
        int nex=trie[rt][(1&(x>>i))];
        if(!nex){
            nex=trie[rt][1^(1&(x>>i))];
            res|=(1<<i);
        }
        rt=nex;
    }
    return res;
}
void dfs(int rt,int dep){
    if(!rt||!dep)
        return ;
    int lson=trie[rt][0];
    int rson=trie[rt][1];
    dfs(lson,dep-1);
    dfs(rson,dep-1);
    if(!lson||!rson){///没有分支了,说明只剩一个集合了
        pos[rt]=pos[lson+rson];
        return ;
    }
    int rid=pos[rson],lid=pos[lson];
    if(v[rid].size()>v[lid].size()){
        swap(rid,lid);
        swap(rson,lson);
    }
    ll tmp=1<<30;
    int m=v[rid].size();
    for(int i=0;i<m;i++){
        tmp=min(tmp,query(v[rid][i],lson,dep-1));
        v[lid].pb(v[rid][i]);
    }
    v[rid].clear();
    ans+=tmp;
    pos[rt]=lid;
}
int main(){
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    sort(a+1,a+1+n);
    add(a[1],1);
    for(int i=2;i<=n;i++){
        if(a[i-1]!=a[i])
            add(a[i],i);
    }
    dfs(1,31);
    printf("%lld
",ans);
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/starve/p/13409040.html