888G - Xor-MST
阿新 • • 發佈:2020-09-09
#include<iostream> #include<cstring> #include<algorithm> #include<cmath> #include<cstdlib> #include<climits> #include<stack> #include<vector> #include<queue> #include<set> #include<bitset> #include<map> //#include<regex> #include<cstdio> #include <iomanip> #pragma GCC optimize(2) #define up(i,a,b) for(int i=a;i<b;i++) #define dw(i,a,b) for(int i=a;i>b;i--) #define upd(i,a,b) for(int i=a;i<=b;i++) #define dwd(i,a,b) for(int i=a;i>=b;i--) //#define local typedef long long ll; typedef unsigned long long ull; const double esp = 1e-6; const double pi = acos(-1.0); const int INF = 0x3f3f3f3f; const int inf = 1e9; using namespace std; ll read() { char ch = getchar(); ll x = 0, f = 1; while (ch<'0' || ch>'9') { if (ch == '-')f = -1; ch = getchar(); } while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); } return x * f; } typedef pair<int, int> pir; #define lson l,mid,root<<1 #define rson mid+1,r,root<<1|1 #define lrt root<<1 #define rrt root<<1|1 const int N = 2e5 + 10; const int B = 30; struct trie { int cnt = 1; int ch[N * 20][2]; vector<int>vec[N * 20]; void insert(int val) { int u = 1; dwd(i, B, 0) { if (val >> i & 1) { if (!ch[u][1])ch[u][1] = ++cnt; u = ch[u][1]; } else { if (!ch[u][0])ch[u][0] = ++cnt; u = ch[u][0]; } vec[u].push_back(val); } } ll query(int o, int x, int d) { if(d < 0)return 0; int bit = x >> d & 1; if (ch[o][bit])return query(ch[o][bit], x, d - 1); else return query(ch[o][bit ^ 1], x, d - 1) | (1 << d); } }T; ll dfs(int o, int d) { if (!o || d < 0)return 0; int lf = T.ch[o][0]; int rt = T.ch[o][1]; ll res = 0; if (lf&&rt) { ll ans = (1 << (d + 1)); for (auto k : T.vec[lf]) { ans = min(ans, T.query(rt, k, d - 1)); } ans += (1 << d); res = ans; } return res + dfs(lf, d - 1) + dfs(rt, d - 1); } int n; int a[N]; int main() { n = read(); upd(i, 1, n)a[i] = read(); sort(a + 1, a + n + 1); upd(i, 1, n)T.insert(a[i]); cout << dfs(1, B) << endl; return 0; }