D. Dr. Evil Underscores
题目链接:https://codeforces.ml/problemset/problem/1285/D
题意:求一个非负整数x 使得 x^a[i] 的最大值最小
思路:考虑建一棵trie 从高位开始往低位扫,每次 如果只有0 或者只有1 那么x的 当前第k位
就肯定能取0,否则的话肯定是取1,然后后面的谁大谁小dp下去求即可, 虽然看上去每次最多可能分支2次 2^n
但是因为trie 建满也只能搜到nlogn 所以复杂度没问题 可以先建trie 也可以边跑边建
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=1e5+10; 4 const int mod=998244353; 5 #define ll long long 6 #define ull unsigned long long 7 #define pi pair<int,int> 8 #define fi first 9 #define sc second 10 #define pb push_back 11 12 int dfs(vector<int>a,int k) 13 { 14 if(k<0) return 0; 15 vector<int>b1,b2; 16 for(auto &v:a) 17 { 18 if((v>>k)&1) b1.pb(v); 19 else b2.pb(v); 20 } 21 if(b1.size()==0) return dfs(b2,k-1); 22 else if(b2.size()==0) return dfs(b1,k-1); 23 else return (1<<k)+min(dfs(b1,k-1),dfs(b2,k-1)); 24 } 25 26 27 int main() 28 { 29 ios::sync_with_stdio(0); 30 cin.tie(0); 31 int n; 32 cin>>n; 33 vector<int>a; 34 for(int i=1;i<=n;i++) 35 { 36 int x; 37 cin>>x; 38 a.pb(x); 39 } 40 cout<<dfs(a,30)<<'\n'; 41 }
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=1e5+10; 4 const int mod=1e9+7; 5 #define ll long long 6 #define pi pair<int,int> 7 #define fi first 8 #define sc second 9 #define pb push_back 10 11 int trie[maxn*32][2]; 12 int tot; 13 14 void add(int x) 15 { 16 int p=0; 17 for(int i=30;i>=0;i--) 18 { 19 int u=(x>>i)&1; 20 if(!trie[p][u]) trie[p][u]=++tot; 21 p=trie[p][u]; 22 } 23 } 24 25 int dfs(int x,int k) 26 { 27 if(k<0) return 0; 28 if(trie[x][0]==0) 29 { 30 return dfs(trie[x][1],k-1); 31 } 32 else if(trie[x][1]==0) 33 { 34 return dfs(trie[x][0],k-1); 35 } 36 else 37 { 38 return (1<<k)+min(dfs(trie[x][1],k-1),dfs(trie[x][0],k-1)); 39 } 40 } 41 42 43 int main() 44 { 45 ios::sync_with_stdio(0); 46 cin.tie(0); 47 int n; 48 cin>>n; 49 for(int i=1;i<=n;i++) 50 { 51 int x; 52 cin>>x; 53 add(x); 54 } 55 cout<<dfs(0,30)<<'\n'; 56 57 58 59 60 61 62 }

浙公网安备 33010602011771号