【HDU6687】Rikka with Stable Marriage(Trie树 贪心)
大意
给定\(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树 贪心)的更多相关文章
- 【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$ ...
- @hdu - 6687@ Rikka with Stable Marriage
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个稳定婚姻匹配问题,其中第 i 个男生与第 j 个女生之间 ...
随机推荐
- 发布 vscode 插件 Cnblogs Client For VSCode 预览版
为了方便大家使用 vscode 发布博文,我们做了一个小插件,今天发布预览版,欢迎大家试用并反馈问题与建议. 插件的英文名称是 Cnblogs Client For VSCode,简称是 vscode ...
- Java 总结 数据底层原理 【包括 ArrayList、LinkedList、hash table、HashMap、Hashtable、ConcurrentHashMap、hash code、HashSet、LinkedHashMap、LinkedHashSet】
1.ArrayList (1)底层是由动态数组实现的[使用了List接口]. (2)动态数组是长度不固定,随着数据的增多而变长. (3)如果不指定,默认长度为10,当添加的元素超过当前数组的长度时,会 ...
- react中使用antd按需加载(第一部)
什么是react按需加载?简单来说就是当我们引用antd的时候需要引入全局css样式,这会对性能造成一定的影响,那么使用按需加载以后就不需要引入css全局样式了,直接引入功能模块即可,既然需要设置按需 ...
- Hive建表和内外部表的使用
原文链接: https://www.toutiao.com/i6766784274965201415 一.普通建表方式 create table stu_info( id int, name stri ...
- CentOS6.5下安装Hadoop-2.7.3(图解教程)
注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6627365258090512909/ 已安装好虚拟机(3个节点) YUM源已安装好.系统版本CentOS6.5.j ...
- Linux环境下的Docker的安装和部署、学习二
DockerFile体系结构(保留字指令) FROM:基础镜像,当前新镜像是基于哪个镜像的 MAINTAINER:镜像维护者的姓名和邮箱地址 RUN:容器构建时需要运行的命令 EXPOSE:当前容器对 ...
- spring是线程安全的吗
spring默认bean是单例无状态的,我们交给spring管理的service,controller都是一个单例的bean,也就是说多个线程共享一个实例. 如果你在这种类里写成员变量,那这个变量的访 ...
- shell基础知识查缺补漏
最近在看<Linux程序设计(第4版)>,其中有一个章节主要讲了shell脚本方面的,内容不细,但是利用较短的篇幅讲的也不少了.对我们自己来说也是一个查缺补漏的过程,所以就写下这篇读书笔记 ...
- 《剑指offer》面试题41. 数据流中的中位数
问题描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. 例 ...
- STC8H开发(五): SPI驱动nRF24L01无线模块
目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...