题意:给定两个长均为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. iView 实战系列教程(21课时)_2.iView 实战教程之导航、路由、鉴权篇

    在c盘创建一个iview-router的项目 . 然后使用默认的配置 跳过 添加vue-router的插件 编译我们的文件. 编译好之后,我们启动App 默认的页面就打开了. 默认两个路由一个是abo ...

  2. Vue中解决路由切换,页面不更新的实用方法

    前言:vue-router的切换不同于传统的页面的切换.路由之间的切换,其实就是组件之间的切换,不是真正的页面切换.这也会导致一个问题,就是引用相同组件的时候,会导致该组件无法更新,也就是我们口中的页 ...

  3. [转载]OpenSSL中文手册之命令行详解(未完待续)

     声明:OpenSSL之命令行详解是根据卢队长发布在https://blog.csdn.net/as3luyuan123/article/details/16105475的系列文章整理修改而成,我自己 ...

  4. base64编解码的另外几个版本

    #include "crypto/encode/base64.h" static const std::string base64_chars = "ABCDEFGHIJ ...

  5. 编程语言分类,Python代码执行,应用程序使用文件的三步骤,变量,常量,垃圾回收机制

    编程语言分为 机器语言(直接用二进制01跟计算机直接沟通交流,直接操作硬件) 优点:计算机能够直接读懂,速度快 缺点:开发效率极低 汇编语言(用简单的英文标签来表示二进制数,直接操作硬件) 优点:开发 ...

  6. ES6新增特性

    ES6:  ECMA 第六次改版   块级作用域:   凡是被{ }包裹住的代码都是块级作用域,除了对象       特点:会造成一个暂时性死区    新增声明变量的两种方式: let:     a. ...

  7. 20190908 On Java8 第十九章 类型信息

    第十九章 类型信息 RTTI(RunTime Type Information,运行时类型信息)能够在程序运行时发现和使用类型信息. Java 主要有两种方式在运行时识别对象和类信息: "传 ...

  8. 手把手教你用Pytorch-Transformers——实战(二)

    本文是<手把手教你用Pytorch-Transformers>的第二篇,主要讲实战 手把手教你用Pytorch-Transformers——部分源码解读及相关说明(一) 使用 PyTorc ...

  9. css-sprite 雪碧图的使用,合并多张小图,背景图片当按钮的设置

    背景图片基础: 使用background-image来设置背景图片 语法: background-image:url(相对与css的路径) 如果背景图片大于元素,默认会显示图片的左上角 如果背景图片和 ...

  10. [2019杭电多校第二场][hdu6601]Keen On Everything But Triangle

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6601 题意是说用给定区间内的数字组成周长最大的三角形. 大致做法就是求区间第1大,第2大和第3大然后判 ...