【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大佬

#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树,贪心)的更多相关文章
- 【BZOJ3261】最大异或和 Trie树+贪心
[BZOJ3261]最大异或和 Description 给定一个非负整数序列 {a},初始长度为 N. 有 M个操作,有以下两种操作类型:1 .A x:添加操作,表示在序列末尾添加一个 ...
- poj3764(dfs+Trie树+贪心)
题目链接:http://poj.org/problem?id=3764 分析:好题!武森09年的论文中有道题CowXor,求的是线性结构上的,连续序列的异或最大值,用的办法是先预处理出前n项的异或值, ...
- BZOJ4567 [Scoi2016]背单词 【trie树 + 贪心】
题目链接 BZOJ4567 题解 题意真是鬼畜= = 意思就是说我们应先将一个串的所有后缀都插入之后再插入这个串,产生代价为其到上一个后缀的距离 我们翻转一下串,转化为前缀,就可以建\(trie\)树 ...
- 【bzoj3261】【最大异或和】可持久化trie树+贪心
[pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=61705397 Description 给定一个非 ...
- [SCOI2016] 背单词 (Trie 树,贪心)
题目链接 大致题意 给你 \(n\) 个字符串, 要求你给出最小的代价. 对于每个字符串: 1.如果它的后缀在它之后,那么代价为 \(n^2\). 2.如果一个字符串没有后缀,那么代价为 \(x\), ...
- 51nod 1526 分配笔名(Trie树+贪心)
建出Trie树然后求出一个点子树中有多少笔名和真名.然后贪心匹配即可. #include<iostream> #include<cstring> #include<cst ...
- 【BZOJ4260】Codechef REBXOR Trie树+贪心
[BZOJ4260]Codechef REBXOR Description Input 输入数据的第一行包含一个整数N,表示数组中的元素个数. 第二行包含N个整数A1,A2,…,AN. Output ...
- [CSP-S模拟测试]:big(Trie树+贪心)
题目描述 你需要在$[0,2^n)$中选一个整数$x$,接着把$x$依次异或$m$个整数$a_1~a_m$.在你选出$x$后,你的对手需要选择恰好一个时刻(刚选完数时.异或一些数后或是最后),将$x$ ...
- 【HDU6687】Rikka with Stable Marriage(Trie树 贪心)
题目链接 大意 给定\(A,B\)两个数组,让他们进行匹配. 我们称\(A_i\)与\(B_j\)的匹配是稳定的,当且仅当目前所剩元素不存在\(A_x\)或\(B_y\)使得 \(A_i\oplus ...
- 【BZOJ4567】[Scoi2016]背单词 Trie树+贪心
[BZOJ4567][Scoi2016]背单词 Description Lweb 面对如山的英语单词,陷入了深深的沉思,“我怎么样才能快点学完,然后去玩三国杀呢?”.这时候睿智 的凤老师从远处飘来,他 ...
随机推荐
- Nginx-Lua模块的执行顺序(转)
一.nginx执行步骤 nginx在处理每一个用户请求时,都是按照若干个不同的阶段依次处理的,与配置文件上的顺序没有关系,详细内容可以阅读<深入理解nginx:模块开发与架构解析>这本书, ...
- node+express 中安装nodemon实时更新server.js
每次启动node server.js,有一个缺点,每次server.js文件有改动时,必须重新执行指令node server.js,新的代码才会起作用 解决方案1 全局安装 npm install s ...
- 练习4-python+selenium+pandas
最近对于python的第三方库pandas比较有兴趣,在学习的过程中也简单的结合selenium做了一个简单的小工具 最新公司用一个外部系统来记录,追踪BUG,可是这个系统并不是专业的BUG管理系统, ...
- lesson1-图的概念和图论模型
说明: 图论专题开设的目的主要是作为本学期复习巩固和分享自己对于图论的理解,主要参考的是老师的PPT.应老师要求,不能共享文件,抱歉! 参考书目:[1] J.A. Bondy, U.S.R. Mur ...
- VLAN 基础设置及Aceess接口
实验内容 本实验模拟企业网络场景.公司内网是一一个大的局域网,二层交换机S1放置在一楼,在一楼办公的部门有IT部和人事部;二层交换机S2放置在二楼,在二楼办公的部门有市场部和研发部.由于交换机组成的是 ...
- js转换后台接受的日期格式
var html = "--";if(data.createTime!=null&&data.createTime!=""){ Date.pro ...
- 单调栈 && 洛谷 P2866 [USACO06NOV]糟糕的一天Bad Hair Day(单调栈)
传送门 这是一道典型的单调栈. 题意理解 先来理解一下题意(原文翻译得有点问题). 其实就是求对于序列中的每一个数i,求出i到它右边第一个大于i的数之间的数字个数c[i].最后求出和. 首先可以暴力求 ...
- java 接口 以及 与抽象类的区别
狭义概念 : Java 中的 interface 广义概念 : 对外提供规则的都是 接口 接口的定义方式 : interface 接口名 { } 用类实现接口: class 类名 imp ...
- Python 的 sys 模块常用方法?
总结就是,os模块负责程序与操作系统的交互,提供了访问操作系统底层的接口; sys模块负责程序与python解释器的交互,提供了一系列的函数和变量,用于操控python的运行时环境. sys.argv ...
- VS2015-MFC基础教程-应用程序工程中文件的组成结构
VS2015应用程序向导生成框架程序后,我们可以在之前设置的Location下看到此文件夹中包含了几个文件和一个以工程名命名的子文件夹,这个子文件夹中又包含了若干个文件和一个res文件夹,创建工程时的 ...