记录编号 601357 评测结果 AAAAAAAAAA
题目名称 4062.Xor-MST 最终得分 100
用户昵称 Gravatarflyfree 是否通过 通过
代码语言 C++ 运行时间 19.710 s
提交时间 2025-06-16 21:02:08 内存使用 153.83 MiB
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
// #define LOCAL
#define ll long long
#define pir pair <ll,ll>
#define fs first
#define sc second
#define MAXN 200010
#define ls(x) son[x][0]
#define rs(x) son[x][1]
inline ll read(){
    ll f = 1, num = 0;
    char c = getchar();
    while(c < '0' || c > '9'){
        if(c=='-') f = -1;c = getchar();
    }
    while(c>='0'&&c<='9') num = num * 10 + c - '0', c = getchar();
    return num * f;
}

int rt[MAXN];
struct node_trie{
    int son[MAXN * 50][2];
    int siz[MAXN * 50],id[MAXN * 50];
    int idx;

    int query(ll v, ll p){
        ll q = rt[0];
        for(int i = 30;i >= 0; --i){
            ll x = (v & (1ll << i)) ? 1 : 0;
            // cout << "query : p: " << p << " q: " << q << " ls: " << siz[son[q][x]] << " " << son[q][x ^ 1] << " " << siz[son[q][x ^ 1]] << " rs:" << siz[son[p][x]] << " " << v << " " << i << " " << x << " " << id[q] << endl;
            if(siz[son[q][x]] - siz[son[p][x]] > 0){
                p = son[p][x];
                q = son[q][x];
            }else{
                p = son[p][x ^ 1];
                q = son[q][x ^ 1];
            }
        }
        // cout << "query : " << q << " " << id[q] << endl;
        return id[q];
    }

    int merge(ll x, ll y){
        if(!x || !y)return x | y;
        siz[x] += siz[y];
        if(!id[x])id[x] = id[y];
        ls(x) = merge(ls(x), ls(y));
        rs(x) = merge(rs(x), rs(y));
        return x;
    }

    void insert(ll p, ll v, ll y){
        for(int i = 30;i >= 0; --i){
            ll x = (v & (1ll << i)) ? 1 : 0;
            if(son[p][x])p = son[p][x];
            else son[p][x] = ++idx, p = son[p][x];
            ++ siz[p];
        }
        // cout << "insert : " << p << " " << y << endl;
        id[p] = y;
    }
}trie;

set <ll> st;

struct node_dsu{
    int fa[MAXN];
    int cnt;
    int get(ll x){
        return fa[x] == x ? x : fa[x] = get(fa[x]);
    }

    void merge(ll x, ll y){
        x = get(x),y = get(y);
        if(x == y)return;
        fa[x] = y;
        -- cnt;
        st.erase(x);
        trie.merge(rt[y], rt[x]);
    }

    void init(ll x){
        cnt = x;
        rt[0] = ++ trie.idx;
        for(int i = 1;i <= x; ++i){
            fa[i] = i;
            rt[i] = ++ trie.idx;
            st.insert(i);
        }
    }
}dsu;

ll n,ans;
int a[MAXN],mn[MAXN],e[MAXN];
bool vis[MAXN];

int main(){
    #ifdef LOCAL
        freopen("w.in", "r", stdin);
        freopen("w.out", "w", stdout);
    #endif

    n = read();
    dsu.init(n);
    for(int i = 1;i <= n; ++i){
        a[i] = read();
        ll stp = trie.idx;
        trie.insert(rt[0], a[i], i);
        trie.insert(rt[i], a[i], i);
        // cout << trie.idx << " " << trie.idx - stp << endl;
    }

    while(dsu.cnt > 1){
        for(auto y : st)vis[y] = e[y] = 0,mn[y] = 1e9;

        // memset(vis, 0, sizeof(vis));
        // memset(mn, 0x3f, sizeof(mn));
        // memset(e, 0, sizeof(e));
        // cout << ans << " " << dsu.cnt << endl;

        for(int i = 1;i <= n; ++i){
            ll fi = dsu.get(i);
            ll y = trie.query(a[i], rt[fi]);
            if((a[i] ^ a[y]) < mn[fi]){
                // cout << i << " " << fi << " " << y << " " << (a[i] ^ a[y]) << endl;
                mn[fi] = a[i] ^ a[y];
                e[fi] = y;
            }
        }

        for(int i = 1;i <= n; ++i){
            ll fi = dsu.get(i);
            if(!vis[fi]){
                vis[fi] = true;
                if(dsu.get(fi) == dsu.get(e[fi]))continue;
                dsu.merge(fi, e[fi]);
                ans += mn[fi];
            }
        }
    }

    cout << ans << endl;

    // cerr << "Time : " << 1.0 * clock() / CLOCKS_PER_SEC << "s \n";
    return 0;
}