题意:给定两个长均为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 ",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 ",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 }