【HDOJ6625】three arrays(Trie树,贪心)

题意:给定两个长均为n的序列a和b,要求两两配对,a[i]和b[j]配对的值为a[i]^b[j],求字典序最小的配对后的值序列

n<=1e5,a[i],b[i]<2^30

思路:

做法一:orz ckw大佬

 

 

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 const int MAX_N=5+5e6;
  4 
  5 int read()
  6 {
  7    int v=0,f=1;
  8    char c=getchar();
  9    while(c<48||57<c) {if(c=='-') f=-1; c=getchar();}
 10    while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar();
 11    return v*f;
 12 }
 13 
 14 vector<int> ans;
 15 struct SEG{
 16     struct Node{
 17         int son[2],sz1,sz2;
 18     }tree[MAX_N];
 19     inline int new_node(){
 20         tree[++top]=(Node){{0,0},0,0};
 21         return top;
 22     }
 23     int rt,top;
 24     inline void up(int x){
 25         tree[x].sz1=tree[tree[x].son[0]].sz1+tree[tree[x].son[1]].sz1;
 26         tree[x].sz2=tree[tree[x].son[0]].sz2+tree[tree[x].son[1]].sz2;
 27     }
 28     void clear(){ top=0,rt=new_node(); }
 29     void insert(int pos,int k1,int k2){
 30         int x=rt;
 31         tree[x].sz1+=k1;
 32         tree[x].sz2+=k2;
 33         for(int i=30;i>=0;--i){
 34             bool t=pos&(1<<i);
 35             if(tree[x].son[t]==0)
 36                 tree[x].son[t]=new_node();
 37             x=tree[x].son[t];
 38             tree[x].sz1+=k1;
 39             tree[x].sz2+=k2;
 40         }
 41     }
 42     int merge(int x,int y){
 43         if(x==0||y==0) return x+y;
 44         tree[x].sz1+=tree[y].sz1;
 45         tree[x].sz2+=tree[y].sz2;
 46         tree[x].son[0]=merge(tree[x].son[0],tree[y].son[0]);
 47         tree[x].son[1]=merge(tree[x].son[1],tree[y].son[1]);
 48         return x;
 49     }
 50     void solve(int x,int key,int p){
 51 //        printf("{%d %d %d}",x,key,p);
 52         if(p==0){
 53             int t=min(tree[x].sz1,tree[x].sz2);
 54 //            printf("[%d]",t);
 55             for(int i=1;i<=t;++i) ans.push_back(key);
 56             tree[x].sz1-=t;
 57             tree[x].sz2-=t;
 58             return;
 59         }
 60         if(tree[x].sz1==0||tree[x].sz2==0) return;
 61         solve(tree[x].son[0],key,p-1);
 62         solve(tree[x].son[1],key,p-1);
 63         up(x);
 64         if(tree[x].sz1==0||tree[x].sz2==0) return;
 65         if(max(tree[tree[x].son[0]].sz1,tree[tree[x].son[0]].sz2)
 66             >max(tree[tree[x].son[1]].sz1,tree[tree[x].son[1]].sz2)){
 67                 tree[x].son[0]=merge(tree[x].son[0],tree[x].son[1]);
 68                 tree[x].son[1]=0;
 69                 solve(tree[x].son[0],key+(1<<p-1),p-1);
 70             }else{
 71                 tree[x].son[1]=merge(tree[x].son[0],tree[x].son[1]);
 72                 tree[x].son[0]=0;
 73                 solve(tree[x].son[1],key+(1<<p-1),p-1);
 74             }
 75         up(x);
 76     }
 77 }seg;
 78 int main(){
 79     //freopen("1.in","r",stdin);
 80     //freopen("1.out","w",stdout);
 81     int T=read();
 82         while(T--){
 83         seg.clear(); ans.clear();
 84         int n=read();
 85         for(int i=1;i<=n;++i)
 86         {
 87             int x=read();
 88             seg.insert(x,1,0);
 89         }
 90 
 91         for(int i=1;i<=n;++i)
 92         {
 93             int x=read();
 94             seg.insert(x,0,1);
 95         }
 96 
 97         seg.solve(1,0,31);
 98         sort(ans.begin(),ans.end());
 99         for(int i=0;i<ans.size()-1;++i) printf("%d ",ans[i]);
100         printf("%d\n",ans[ans.size()-1]);
101     }
102     return 0;
103 }

 做法二:

 

 

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 typedef long long ll;
  4 typedef unsigned int uint;
  5 typedef unsigned long long ull;
  6 typedef pair<int,int> PII;
  7 typedef pair<ll,ll> Pll;
  8 typedef vector<int> VI;
  9 typedef vector<PII> VII;
 10 //typedef pair<ll,ll>P;
 11 #define N  100010
 12 #define M  200010
 13 #define fi first
 14 #define se second
 15 #define MP make_pair
 16 #define pb push_back
 17 #define pi acos(-1)
 18 #define mem(a,b) memset(a,b,sizeof(a))
 19 #define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
 20 #define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
 21 #define lowbit(x) x&(-x)
 22 #define Rand (rand()*(1<<16)+rand())
 23 #define id(x) ((x)<=B?(x):m-n/(x)+1)
 24 #define ls p<<1
 25 #define rs p<<1|1
 26 
 27 const int MOD=1e9+7,inv2=(MOD+1)/2;
 28       double eps=1e-4;
 29       int INF=1e9;
 30       int inf=0x7fffffff;
 31       int dx[4]={-1,1,0,0};
 32       int dy[4]={0,0,-1,1};
 33 
 34 int t[N*31][2],s[N*31][2],a[N],b[N],ans[N],m,cnt;
 35 
 36 int read()
 37 {
 38    int v=0,f=1;
 39    char c=getchar();
 40    while(c<48||57<c) {if(c=='-') f=-1; c=getchar();}
 41    while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar();
 42    return v*f;
 43 }
 44 
 45 void update(int x,int y,int op)
 46 {
 47     int u=1;
 48     per(i,29,0)
 49     {
 50         int now=(x>>i)&1;
 51         if(!t[u][now]) t[u][now]=++cnt;
 52         u=t[u][now];
 53         s[u][op]+=y;
 54     }
 55 }
 56 
 57 int query(int x,int op)
 58 {
 59     int u=1,res=0;
 60     per(i,29,0)
 61     {
 62         int now=(x>>i)&1;
 63         if(t[u][now]&&s[t[u][now]][op])
 64         {
 65             if(now) res+=1<<i;
 66             u=t[u][now];
 67         }
 68          else
 69          {
 70              if(now^1) res+=1<<i;
 71              u=t[u][now^1];
 72          }
 73 
 74     }
 75     return res;
 76 }
 77 
 78 int find(int op)
 79 {
 80     int u=1,res=0;
 81     per(i,29,0)
 82     {
 83         if(t[u][0]&&s[t[u][0]][op]) u=t[u][0];
 84          else
 85          {
 86              res+=1<<i;
 87              u=t[u][1];
 88          }
 89     }
 90     return res;
 91 }
 92 
 93 int dfs(int x,int op,int pre)
 94 {
 95     while(1)
 96     {
 97         int y=query(x,op^1);
 98         if(y==pre)
 99         {
100             ans[++m]=x^y;
101             update(x,-1,op);
102             update(y,-1,op^1);
103             return 1;
104         }
105         if(dfs(y,op^1,x)) return 0;
106     }
107 }
108 
109 void solve()
110 {
111     int n=read();
112     cnt=1;
113     rep(i,1,n)
114     {
115         a[i]=read();
116         update(a[i],1,0);
117     }
118     rep(i,1,n)
119     {
120         b[i]=read();
121         update(b[i],1,1);
122     }
123 
124     m=0;
125     while(m<n)
126     {
127         int x=find(0);
128         dfs(x,0,-1);
129     }
130 
131     sort(ans+1,ans+n+1);
132     rep(i,1,n-1) printf("%d ",ans[i]);
133     printf("%d\n",ans[n]);
134     rep(i,1,cnt)
135      rep(j,0,1) t[i][j]=s[i][j]=0;
136 }
137 
138 int main()
139 {
140     int cas=read();
141     while(cas--) solve();
142     return 0;
143 }

 

posted on 2019-10-10 17:00  myx12345  阅读(182)  评论(0编辑  收藏  举报

导航