[CF1285D] Dr. Evil Underscores - 分治,dp
Description
给定一个长度为 n 的整数序列 a,找到一个自然数 x 使得 max(ai xor x) 最小。输出这个最小值。
Solution
做一个 trie 树上的 dp
对于 trie 树上每个节点,设 (f[p]) 表示这个节点子树内所有 x 选择的最小值
如果 trie 树某个结点的两个孩子有一个为空,那么我们显然会从非空的那一边转移
否则,我们在两边计算出的结果中取最小值
实际上我们只要模拟分治过程就可以了,没必要真的建立 trie 树
#include <bits/stdc++.h>
using namespace std;
int solve(vector<int> a, int k)
{
if (k < 0)
return 0;
if (a.size() == 0)
return 0;
vector<int> ch[2];
for (auto i : a)
ch[(i >> k) & 1].push_back(i);
if (ch[0].size() == 0)
return solve(ch[1], k - 1);
if (ch[1].size() == 0)
return solve(ch[0], k - 1);
return min(solve(ch[0], k - 1), solve(ch[1], k - 1)) + (1 << k);
}
signed main()
{
ios::sync_with_stdio(false);
int n;
cin >> n;
vector<int> a;
for (int i = 1; i <= n; i++)
{
int x;
cin >> x;
a.push_back(x);
}
cout << solve(a, 30) << endl;
}