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

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

思路:

做法一:orz ckw大佬

 #include<bits/stdc++.h>
using namespace std;
const int MAX_N=+5e6; int read()
{
int v=,f=;
char c=getchar();
while(c<||<c) {if(c=='-') f=-; c=getchar();}
while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
return v*f;
} vector<int> ans;
struct SEG{
struct Node{
int son[],sz1,sz2;
}tree[MAX_N];
inline int new_node(){
tree[++top]=(Node){{,},,};
return top;
}
int rt,top;
inline void up(int x){
tree[x].sz1=tree[tree[x].son[]].sz1+tree[tree[x].son[]].sz1;
tree[x].sz2=tree[tree[x].son[]].sz2+tree[tree[x].son[]].sz2;
}
void clear(){ top=,rt=new_node(); }
void insert(int pos,int k1,int k2){
int x=rt;
tree[x].sz1+=k1;
tree[x].sz2+=k2;
for(int i=;i>=;--i){
bool t=pos&(<<i);
if(tree[x].son[t]==)
tree[x].son[t]=new_node();
x=tree[x].son[t];
tree[x].sz1+=k1;
tree[x].sz2+=k2;
}
}
int merge(int x,int y){
if(x==||y==) return x+y;
tree[x].sz1+=tree[y].sz1;
tree[x].sz2+=tree[y].sz2;
tree[x].son[]=merge(tree[x].son[],tree[y].son[]);
tree[x].son[]=merge(tree[x].son[],tree[y].son[]);
return x;
}
void solve(int x,int key,int p){
// printf("{%d %d %d}",x,key,p);
if(p==){
int t=min(tree[x].sz1,tree[x].sz2);
// printf("[%d]",t);
for(int i=;i<=t;++i) ans.push_back(key);
tree[x].sz1-=t;
tree[x].sz2-=t;
return;
}
if(tree[x].sz1==||tree[x].sz2==) return;
solve(tree[x].son[],key,p-);
solve(tree[x].son[],key,p-);
up(x);
if(tree[x].sz1==||tree[x].sz2==) return;
if(max(tree[tree[x].son[]].sz1,tree[tree[x].son[]].sz2)
>max(tree[tree[x].son[]].sz1,tree[tree[x].son[]].sz2)){
tree[x].son[]=merge(tree[x].son[],tree[x].son[]);
tree[x].son[]=;
solve(tree[x].son[],key+(<<p-),p-);
}else{
tree[x].son[]=merge(tree[x].son[],tree[x].son[]);
tree[x].son[]=;
solve(tree[x].son[],key+(<<p-),p-);
}
up(x);
}
}seg;
int main(){
//freopen("1.in","r",stdin);
//freopen("1.out","w",stdout);
int T=read();
while(T--){
seg.clear(); ans.clear();
int n=read();
for(int i=;i<=n;++i)
{
int x=read();
seg.insert(x,,);
} for(int i=;i<=n;++i)
{
int x=read();
seg.insert(x,,);
} seg.solve(,,);
sort(ans.begin(),ans.end());
for(int i=;i<ans.size()-;++i) printf("%d ",ans[i]);
printf("%d\n",ans[ans.size()-]);
}
return ;
}

做法二:

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> Pll;
typedef vector<int> VI;
typedef vector<PII> VII;
//typedef pair<ll,ll>P;
#define N 100010
#define M 200010
#define fi first
#define se second
#define MP make_pair
#define pb push_back
#define pi acos(-1)
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
#define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
#define lowbit(x) x&(-x)
#define Rand (rand()*(1<<16)+rand())
#define id(x) ((x)<=B?(x):m-n/(x)+1)
#define ls p<<1
#define rs p<<1|1 const int MOD=1e9+,inv2=(MOD+)/;
double eps=1e-;
int INF=1e9;
int inf=0x7fffffff;
int dx[]={-,,,};
int dy[]={,,-,}; int t[N*][],s[N*][],a[N],b[N],ans[N],m,cnt; int read()
{
int v=,f=;
char c=getchar();
while(c<||<c) {if(c=='-') f=-; c=getchar();}
while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
return v*f;
} void update(int x,int y,int op)
{
int u=;
per(i,,)
{
int now=(x>>i)&;
if(!t[u][now]) t[u][now]=++cnt;
u=t[u][now];
s[u][op]+=y;
}
} int query(int x,int op)
{
int u=,res=;
per(i,,)
{
int now=(x>>i)&;
if(t[u][now]&&s[t[u][now]][op])
{
if(now) res+=<<i;
u=t[u][now];
}
else
{
if(now^) res+=<<i;
u=t[u][now^];
} }
return res;
} int find(int op)
{
int u=,res=;
per(i,,)
{
if(t[u][]&&s[t[u][]][op]) u=t[u][];
else
{
res+=<<i;
u=t[u][];
}
}
return res;
} int dfs(int x,int op,int pre)
{
while()
{
int y=query(x,op^);
if(y==pre)
{
ans[++m]=x^y;
update(x,-,op);
update(y,-,op^);
return ;
}
if(dfs(y,op^,x)) return ;
}
} void solve()
{
int n=read();
cnt=;
rep(i,,n)
{
a[i]=read();
update(a[i],,);
}
rep(i,,n)
{
b[i]=read();
update(b[i],,);
} m=;
while(m<n)
{
int x=find();
dfs(x,,-);
} sort(ans+,ans+n+);
rep(i,,n-) printf("%d ",ans[i]);
printf("%d\n",ans[n]);
rep(i,,cnt)
rep(j,,) t[i][j]=s[i][j]=;
} int main()
{
int cas=read();
while(cas--) solve();
return ;
}

【HDOJ6625】three arrays(Trie树,贪心)的更多相关文章

  1. 【BZOJ3261】最大异或和 Trie树+贪心

    [BZOJ3261]最大异或和 Description 给定一个非负整数序列 {a},初始长度为 N.       有   M个操作,有以下两种操作类型:1 .A x:添加操作,表示在序列末尾添加一个 ...

  2. poj3764(dfs+Trie树+贪心)

    题目链接:http://poj.org/problem?id=3764 分析:好题!武森09年的论文中有道题CowXor,求的是线性结构上的,连续序列的异或最大值,用的办法是先预处理出前n项的异或值, ...

  3. BZOJ4567 [Scoi2016]背单词 【trie树 + 贪心】

    题目链接 BZOJ4567 题解 题意真是鬼畜= = 意思就是说我们应先将一个串的所有后缀都插入之后再插入这个串,产生代价为其到上一个后缀的距离 我们翻转一下串,转化为前缀,就可以建\(trie\)树 ...

  4. 【bzoj3261】【最大异或和】可持久化trie树+贪心

    [pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=61705397 Description 给定一个非 ...

  5. [SCOI2016] 背单词 (Trie 树,贪心)

    题目链接 大致题意 给你 \(n\) 个字符串, 要求你给出最小的代价. 对于每个字符串: 1.如果它的后缀在它之后,那么代价为 \(n^2\). 2.如果一个字符串没有后缀,那么代价为 \(x\), ...

  6. 51nod 1526 分配笔名(Trie树+贪心)

    建出Trie树然后求出一个点子树中有多少笔名和真名.然后贪心匹配即可. #include<iostream> #include<cstring> #include<cst ...

  7. 【BZOJ4260】Codechef REBXOR Trie树+贪心

    [BZOJ4260]Codechef REBXOR Description Input 输入数据的第一行包含一个整数N,表示数组中的元素个数. 第二行包含N个整数A1,A2,…,AN. Output ...

  8. [CSP-S模拟测试]:big(Trie树+贪心)

    题目描述 你需要在$[0,2^n)$中选一个整数$x$,接着把$x$依次异或$m$个整数$a_1~a_m$.在你选出$x$后,你的对手需要选择恰好一个时刻(刚选完数时.异或一些数后或是最后),将$x$ ...

  9. 【HDU6687】Rikka with Stable Marriage(Trie树 贪心)

    题目链接 大意 给定\(A,B\)两个数组,让他们进行匹配. 我们称\(A_i\)与\(B_j\)的匹配是稳定的,当且仅当目前所剩元素不存在\(A_x\)或\(B_y\)使得 \(A_i\oplus ...

  10. 【BZOJ4567】[Scoi2016]背单词 Trie树+贪心

    [BZOJ4567][Scoi2016]背单词 Description Lweb 面对如山的英语单词,陷入了深深的沉思,“我怎么样才能快点学完,然后去玩三国杀呢?”.这时候睿智 的凤老师从远处飘来,他 ...

随机推荐

  1. SqlServer 主重复制

    一.准备工作: 主数据库服务器: OS:Windows Server 2008 R2    DB: SQL Server 2008 R2 Hostname : CXMasterDB IP: 192.1 ...

  2. struts2 基础5 OGNL、标签、四大域、默认拦截器说明

    OGNL表达式 OGNL:对象导抗图语言 OGNL表达式是一个上下文的概念,上下文Map结构 OGNL表达式需要使用#标注命名空间.访问上下文(Context)中的对象需要使用#符号标注命名空间,如# ...

  3. LeNet-5详解

    一.前言 LeNet-5出自论文Gradient-Based Learning Applied to Document Recognition,是一种用于手写体字符识别的非常高效的卷积神经网络. 本文 ...

  4. Tomcat控制台

    一般在安装完成Tomcat之后,我们需要验证tomcat是否安装成功,在浏览器的url中输入:http://127.0.0.1:8080/,就会进入如下的页面(表示安装成功): 在上面的左侧顶部,有一 ...

  5. JavaSE编码试题强化练习3

    1.给20块钱买可乐,每瓶可乐3块钱,喝完之后退瓶子可以换回1块钱,问最多可以喝到多少瓶可乐. public class TestCirculation { public static void ma ...

  6. Leveldb--Slice

    http://www.kuqin.com/database/20110919/265041.html Slice非常简单的数据结构,它包括length和一个指向外部字节数组的指针.为什么使用Slice ...

  7. Java开发第一次面试经验(视频面试)

    坐标:山东潍坊公共实训基地 面试岗位:java开发实习生 我们班级一共6个人一起面试,1对1,其他人坐在旁边倾听,两个大牛,四个酱油,我应该是最黑的酱油啦. 面试问题: 1.请简短的做一下自我介绍: ...

  8. 小白学Python(10)——pyecharts 绘制仪表图 Gauge

    from pyecharts import options as opts from pyecharts.charts import Gauge, Page gauge=( Gauge() .add( ...

  9. 说明一下 os.path 和 sys.path 分别代表什么?

    os.path 主要是用于对系统路径文件的操作. sys.path 主要是对Python解释器的系统环境参数的操作(动态的改变Python解释器搜索路径).

  10. Hdu 4578 Transformation (线段树 分类分析)

    Transformation Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 65535/65536 K (Java/Others)T ...