【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 面对如山的英语单词,陷入了深深的沉思,“我怎么样才能快点学完,然后去玩三国杀呢?”.这时候睿智 的凤老师从远处飘来,他 ...
随机推荐
- 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_10 斗地主案例(双列)_1_斗地主案例的需求分析
之前做的斗地主的版本,没有从小到大进行排序 一个存储牌的花色,一个存储牌的序号. 放牌的容器.使用Map 再创建一个集合进行洗牌. 调用shuffer方法洗牌.生成后就是随即的索引了.
- nginx windows安装基础
nginx在 window上运行需要1.17.3以上. 官方文件https://nginx.org/en/docs/windows.html nginx启动: 1:进入安装目录,双击nginx.exe ...
- [转]JavaScript构造函数及原型对象
JavaScript中没有类的概念,所以其在对象创建方面与面向对象语言有所不同. JS中对象可以定义为”无序属性的集合”.其属性可以包含基本值,对象以及函数.对象实质上就是一组没有特定顺序的值,对象中 ...
- Maven 修改jdk版本
Maven 修改jdk版本方法1: <build> <plugins> <plugin> <groupId>org.apache.maven.plugi ...
- 深入浅出Oracle数据读取一致性和事务表
保证Oracle数据库读取一致性的关键是SCN.每一个数据块头都会记录一个事务提交的SCN.同时每一数据块头都包含一个事务表(ITL),事务必须获得一个ITL事务表才能进行数据修改.该事务表用来确定当 ...
- 反射、getattr
#coding=utf-8 class Dog(object): def __init__(self,name): self.name = name def eat(self): print '123 ...
- 5.MCScanX 与circos下载、安装、运用
一.MCSCAN 参考 :http://chibba.pgml.uga.edu/mcscan2/MCScanX.zip http://chibba.pgml.uga.edu/mcscan2/#tm ...
- go中基本数据类型的相互转换
代码 // 基本数据类型的相互转换 package main import ( // 如果一个包没有被使用过,但又不想去掉,可在包名前加"_ "表示忽略 // 比如:_ " ...
- struts2导入多个xml引入报错<include>
struts.xml <?xml version="1.0" encoding="UTF-8"?> <!-- 指定Struts 2配置文件的D ...
- Spark 计算人员三度关系
1.一度人脉:双方直接是好友 2.二度人脉:双方有一个以上共同的好友,这时朋友网可以计算出你们有几个共同的好友并且呈现数字给你.你们的关系是: 你->朋友->陌生人 3.三度人脉:即你朋友 ...