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 }
View Code
 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 }
View Code

 

posted @ 2021-02-28 14:00  canwinfor  阅读(51)  评论(0)    收藏  举报