【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 面对如山的英语单词,陷入了深深的沉思,“我怎么样才能快点学完,然后去玩三国杀呢?”.这时候睿智 的凤老师从远处飘来,他 ...
随机推荐
- axios 获取不到数据错误
1.问题: 打算学习下vue,但是vue-resource作者已经不更新了,并且大家都建议用axios来进行前后端交互,所以就从学习axios开始. 但是在使用 axios 的过程中,自己写的接口竟然 ...
- GMS测试常用命令CTS>S&VTS
本文档介绍一下cts,gts,sts,vts,cts-on-gsi等测试的常用命令,基于Android9. [附件]Google官网的命令网页. 常用通用命令参数: 列出历史测试结果:l r 指定设备 ...
- Ngix 配置与部署(wsgi,uwsgi,uWSGI)
1. WSGI 是一种协议接口,他是描述web服务器如何与web应用程序(Django ,Flask ) 通讯的规范. 2. uwsgi 与WSGI协议一样,是uWSGI服务器的独占协议,用于定义传输 ...
- idea注册
1:要先得到一个注册码 http://idea.lanyus.com/ 2:之后需要在引导下 修改文件 使用前请将“0.0.0.0 account.jetbrains.com”添加到hosts文件中
- django中orm多表查询,减少数据库查询操作
.select_related() 的使用
- Websocket如何建立连接
前面提到,WebSocket复用了HTTP的握手通道.具体指的是,客户端通过HTTP请求与WebSocket服务端协商升级协议.协议升级完成后,后续的数据交换则遵照WebSocket的协议. 1.客户 ...
- Git利用命令行提交代码步骤
利用命令行提交代码步骤进入你的项目目录1:拉取服务器代码,避免覆盖他人代码git pull2:查看当前项目中有哪些文件被修改过git status具体状态如下:1:Untracked: 未跟踪,一般为 ...
- SpringBoot(三) -- SpringBoot与日志
一.日志的起源 现在假设一个开发人员在开发一个大型系统,由于这个系统过于庞大没在很多的地方将关键的数据使用System.out.println()打印,但是当我们在项目正式上线时又需要去除,在项目bu ...
- 懵圈了,面试官问一个 TCP 连接可发多少个 HTTP 请求?
作者:松若章 https://zhuanlan.zhihu.com/p/61423830 一道经典的面试题是从 URL 在浏览器被被输入到页面展现的过程中发生了什么,大多数回答都是说请求响应之后 DO ...
- java变量的类型
变量的类型 一 按数据类型分: 1.基本数据类型 : 整型 : byte (1字节 - (-128 ~ 127)) short (2字节) int (4字节) long (8字节) 浮点型 : ...