• 【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
    ",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 }
  • 相关阅读:
    多层神经网络与C++实现
    反向传导算法的推导
    sizeof()和strlen()的区别与联系
    Pascal’s Triangle
    Multiply Strings
    spring boot 数据源 配置
    spring boot 静态资源。。
    spring boot 配置 beetl 视图解析器
    spring 使用junit
    spring aspectj 注解
  • 原文地址:https://www.cnblogs.com/myx12345/p/11649221.html
Copyright © 2020-2023  润新知