题目链接

大意

给定\(A,B\)两个数组,让他们进行匹配。

我们称\(A_i\)与\(B_j\)的匹配是稳定的,当且仅当目前所剩元素不存在\(A_x\)或\(B_y\)使得

\(A_i\oplus B_j<A_i\oplus B_y\)\(A_i\oplus B_j<A_x\oplus B_j\)成立

问所有稳定匹配的情况中\(A_i\oplus B_j\)之和最大的是多少。

思路

考虑找到当前异或和最大的一对\(A_i\oplus B_j\),那么不会存在一个\(A_x\)或\(B_y\)可以使得它不稳定,所以这对\(A_i\oplus B_j\)一定会被计入答案。

所以我们每次只用找最大的\(A_i\oplus B_j\)就行了。

考虑如何查找出最大的\(A_i\oplus B_j\):

我们可以使用两颗Trie树分别维护出\(A,B\)的信息。

贪心地想,我们每次查找从高位开始,走完全相反的两个方向(如果可以走),一定会比不走相反的方向优。

这样查找可以满足双方面最大,即找出来的\(A_i,B_j\)一定是会计入答案的(尽管可能不是当前最大的\(A_i\oplus B_j\))。

因为如果该点对没计入到答案,那么当前一定会存在更优的某个\(A_x\)或\(B_y\)使得它不稳定,那么在查找的途中,一定就会进入另一条更优的支路。

所以这样查找依旧可以满足答案的正确性。

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=100005;
int K,N;
long long Ans;
struct Tree{
int Cnt,Root;
struct Node{
int val,dep;
int ch[2];
}s[MAXN*31];
void Insert(int rt,int val,int dep){
s[rt].val++;s[rt].dep=dep;
if(dep==-1)return ;
int u=(1&(val>>dep));
if(!s[rt].ch[u])s[rt].ch[u]=++Cnt;
Insert(s[rt].ch[u],val,dep-1);
}
}T1,T2;
void Clear(){
for(int i=1;i<=T1.Cnt;i++)T1.s[i].ch[0]=T1.s[i].ch[1]=T1.s[i].dep=T1.s[i].val=0;
for(int i=1;i<=T2.Cnt;i++)T2.s[i].ch[0]=T2.s[i].ch[1]=T2.s[i].dep=T2.s[i].val=0;
T1.Root=T2.Root=T1.Cnt=T2.Cnt=1;Ans=0;
}
void Query(){
int rt1=T1.Root,rt2=T2.Root;
for(int i=30;i>=0;i--){
if(T1.s[T1.s[rt1].ch[0]].val&&T2.s[T2.s[rt2].ch[1]].val)
rt1=T1.s[rt1].ch[0],rt2=T2.s[rt2].ch[1],Ans+=(1<<i);
else if(T1.s[T1.s[rt1].ch[1]].val&&T2.s[T2.s[rt2].ch[0]].val)
rt1=T1.s[rt1].ch[1],rt2=T2.s[rt2].ch[0],Ans+=(1<<i);
else if(T1.s[T1.s[rt1].ch[0]].val&&T2.s[T2.s[rt2].ch[0]].val)
rt1=T1.s[rt1].ch[0],rt2=T2.s[rt2].ch[0];
else if(T1.s[T1.s[rt1].ch[1]].val&&T2.s[T2.s[rt2].ch[1]].val)
rt1=T1.s[rt1].ch[1],rt2=T2.s[rt2].ch[1];
T1.s[rt1].val--;T2.s[rt2].val--;
}
}
int main(){
scanf("%d",&K);
while(K--){
Clear();
scanf("%d",&N);
for(int i=1,x;i<=N;i++)
scanf("%d",&x),T1.Insert(T1.Root,x,30);
for(int i=1,x;i<=N;i++)
scanf("%d",&x),T2.Insert(T2.Root,x,30);
for(int i=1;i<=N;i++)Query();
printf("%lld\n",Ans);
}
}

后记

其实题意不能简单地化为让\(A\),\(B\)两两匹配的异或和最大。

(因为要满足稳定条件,且若的按和最大去做会被以下数据卡掉)

1
2
1 2
2 7

正解为6,手跑和最大为8

【HDU6687】Rikka with Stable Marriage(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. @hdu - 6687@ Rikka with Stable Marriage

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个稳定婚姻匹配问题,其中第 i 个男生与第 j 个女生之间 ...

随机推荐

  1. 发布 vscode 插件 Cnblogs Client For VSCode 预览版

    为了方便大家使用 vscode 发布博文,我们做了一个小插件,今天发布预览版,欢迎大家试用并反馈问题与建议. 插件的英文名称是 Cnblogs Client For VSCode,简称是 vscode ...

  2. Java 总结 数据底层原理 【包括 ArrayList、LinkedList、hash table、HashMap、Hashtable、ConcurrentHashMap、hash code、HashSet、LinkedHashMap、LinkedHashSet】

    1.ArrayList (1)底层是由动态数组实现的[使用了List接口]. (2)动态数组是长度不固定,随着数据的增多而变长. (3)如果不指定,默认长度为10,当添加的元素超过当前数组的长度时,会 ...

  3. react中使用antd按需加载(第一部)

    什么是react按需加载?简单来说就是当我们引用antd的时候需要引入全局css样式,这会对性能造成一定的影响,那么使用按需加载以后就不需要引入css全局样式了,直接引入功能模块即可,既然需要设置按需 ...

  4. Hive建表和内外部表的使用

    原文链接: https://www.toutiao.com/i6766784274965201415 一.普通建表方式 create table stu_info( id int, name stri ...

  5. CentOS6.5下安装Hadoop-2.7.3(图解教程)

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6627365258090512909/ 已安装好虚拟机(3个节点) YUM源已安装好.系统版本CentOS6.5.j ...

  6. Linux环境下的Docker的安装和部署、学习二

    DockerFile体系结构(保留字指令) FROM:基础镜像,当前新镜像是基于哪个镜像的 MAINTAINER:镜像维护者的姓名和邮箱地址 RUN:容器构建时需要运行的命令 EXPOSE:当前容器对 ...

  7. spring是线程安全的吗

    spring默认bean是单例无状态的,我们交给spring管理的service,controller都是一个单例的bean,也就是说多个线程共享一个实例. 如果你在这种类里写成员变量,那这个变量的访 ...

  8. shell基础知识查缺补漏

    最近在看<Linux程序设计(第4版)>,其中有一个章节主要讲了shell脚本方面的,内容不细,但是利用较短的篇幅讲的也不少了.对我们自己来说也是一个查缺补漏的过程,所以就写下这篇读书笔记 ...

  9. 《剑指offer》面试题41. 数据流中的中位数

    问题描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. 例 ...

  10. STC8H开发(五): SPI驱动nRF24L01无线模块

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...