trie树的应用;
链接:https://ac.nowcoder.com/acm/contest/920/B
来源:牛客网
定义一张图的生成链是原图的一棵生成树,且这棵树退化成一条链。我们称一条生成链是原图的最小生成链,当且仅当该最小生成链中边权最大的边是原图的所有生成链最大边的边权中最小的。
现有一个 n 个点的完全图,点编号为1 到 n。另给出一个长度为n 的序列 ai,完全图中第 i 个点与第j 个点间的边的边权为 ai⊕aj,其中 ⊕ 表示按位异或运算。
请您找出该完全图的最小生成链。由于答案可能很多,您只需输出这条最小生成链中边权最大的边的边权即可。
这道题可以想到一个性质,就是在比较两个数的大小时,如果前面位置的数相同,从第一个不同的数开始比较,那么位置大的数大的这个数就大;
就是从高位比较;
二进制数也有这个性质;
这个题可以用最小生成树来写暴力(部分分),就是可以证明最小生成树上最大的边等于最小生成链上最大的边;
我也不会证,我也不敢问;
贴个题解
:作者:Tweetuzki
链接:https://ac.nowcoder.com/discuss/227149?type=101
来源:牛客网
证明:首先最小生成树的最大边一定不大于最小生成链的最大边,
然后按照下文的做法分为 0,1 两块后,
中间这条边就是最小生成链最大边。
如果不连上这条边,那么 0的连通块和 1的连通块无法连通。
因此这条边一定在最小生成树中,也就是说最小生成树的最大边不小于最小生成链的最大边。
于是就证明了两种的最大边相等。
就是在所有点的权值中,前面的位置数都相同,那么异或后都是零,不用管;
从第一个有0有1的位置开始(位置为i),可以把0分为一组,1分为一组;
0中连边不会超过1<<i,1也是一样;
那么只缺这两个连通块中连一条边了,这个边就是最大边;
我们希望这个交界的部分两元素异或值最小。也就是说,我们需要从这一位为 00 的元素中和这一位为 11的元素中各找出一个元素,使得这两个元素的异或值最小。
接下来这个找最小值的过程可以进行优化。这里有异或操作,很自然地能够想到 0-1 Trie。我们可以维护一棵 0-1 Trie,我们将序列中所有这一位为 0 的元素插入这棵 Trie,然后用所有这一位为 1的元素去 Trie 中查异或最小值。最后所有最小值的最小值就是答案了。
要注意特判一下所有元素都相同的情况,因为这会找不到这个最高的位满足这一位上有 0 和 1。
时间复杂度和空间复杂度都是 O(nlogai)。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e6+;
typedef long long ll;
ll trie[][maxn],cnt=;
ll n,a[maxn];
ll maxl=-;
ll ans=1e18;
void insert(ll x)
{
int u=;
for(int i=;i>=;i--)
{
int c=(x&(1ll<<i))?:;
if(!trie[c][u]) trie[c][u]=++cnt;
u=trie[c][u];
}
} ll qmin(ll x)
{
int u=;
ll res=;
for(int i=;i>=;i--)
{
int c=(x&(1ll<<i))?:;
if(trie[c][u]!=) u=trie[c][u];
else
{
res|=1ll<<i;
u=trie[c^][u];
}
}
return res;
}
int main()
{
scanf("%lld",&n);
for(int i=;i<=n;i++)
{
scanf("%lld",a+i);
}
sort(a+,a+n+);
for(int i=;i>=;i--)
{
if((a[]^a[n])&(1ll<<i))
{
maxl=i;
break;
}
}
if(maxl==-)
{
printf("");
return ;
}
for(int i=;i<=n;i++)
{
if(a[i]&(1ll<<maxl)) ans=min(ans,qmin(a[i]));
else insert(a[i]);
}
printf("%lld",ans);
return ;
}
trie树的应用;的更多相关文章
- 基于trie树做一个ac自动机
基于trie树做一个ac自动机 #!/usr/bin/python # -*- coding: utf-8 -*- class Node: def __init__(self): self.value ...
- 基于trie树的具有联想功能的文本编辑器
之前的软件设计与开发实践课程中,自己构思的大作业题目.做的具有核心功能,但是还欠缺边边角角的小功能和持久化数据结构,先放出来,有机会一点点改.github:https://github.com/chu ...
- hihocoder-1014 Trie树
hihocoder 1014 : Trie树 link: https://hihocoder.com/problemset/problem/1014 题意: 实现Trie树,实现对单词的快速统计. # ...
- 洛谷P2412 查单词 [trie树 RMQ]
题目背景 滚粗了的HansBug在收拾旧英语书,然而他发现了什么奇妙的东西. 题目描述 udp2.T3如果遇到相同的字符串,输出后面的 蒟蒻HansBug在一本英语书里面找到了一个单词表,包含N个单词 ...
- 通过trie树实现单词自动补全
/** * 实现单词补全功能 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #incl ...
- #1014 Trie树
本题主要是求构造一棵Trie树,即词典树用于统计单词. C#代码如下: using System; using System.Collections.Generic; using System.Lin ...
- Trie树-字典查找
描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一本词典,于是小Hi就向小Ho提出了那个经典的问题: ...
- Trie树的创建、插入、查询的实现
原文:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=28977986&id=3807947 1.什么是Trie树 Tr ...
- Trie树(c++实现)
转:http://www.cnblogs.com/kaituorensheng/p/3602155.html http://blog.csdn.net/insistgogo/article/detai ...
- [转]双数组TRIE树原理
原文名称: An Efficient Digital Search Algorithm by Using a Double-Array Structure 作者: JUN-ICHI AOE 译文: 使 ...
随机推荐
- Mybatis中Like 的使用方式以及一些注意点
做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 模糊查询在项目中还是经常使用的,本文就简单整理Mybatis中使用Like进行模糊查询的几种写法以及一些常见的问题. 使用 ...
- 学习C#自作计算器,菜鸟初学,有大神的指点,希望做的不够好的地方请大家多多指导。同时希望非常无聊的大神能加些其它计算进去
可以做幂运算,根号运算,十进制与二进制互转,16进制与十进制互转 namespace WindowsFormsApplication15 { public partial class 祥哥计算器 : ...
- 八、wepy代码规范
变量与方法尽量使用驼峰式命名,并且注意避免使用$开头. 以$开头的标识符为WePY框架的内建属性和方法,可在JavaScript脚本中以this.的方式直接使用,具体请参考API文档. 小程序入口.页 ...
- 转录组测序(RNA-seq)技术
转录组是某个物种或者特定细胞类型产生的所有转录本的集合.转录组研究能够从整体水 平研究基因功能以及基因结构,揭示特定生物学过程以及疾病发生过程中的分子机理,已广泛应 用于基础研究.临床诊断和药 ...
- Shell学习笔记:awk实现group by分组统计功能
日常部分数据以 txt 的文件格式提供,为避免入库之后再进行统计的麻烦,故学习 shell 进行处理,减少工作量. 1.样例数据 # test.txt YD5Gxxx|6618151|68254490 ...
- Java 之 JDK9 对集合添加的优化
通常,在代码中创建一个集合(例如,List 或 Set ),并直接用一些元素填充它. 实例化集合,几个 add方法调用,使得代码重复. Java 9,添加了几种集合工厂方法,更方便创建少量元素的集合. ...
- webbrowser 屏蔽脚本错误
webBrowser1.ScriptErrorsSuppressed = true
- JS 百度地图 换地图主题颜色(自定义)
JS 百度地图 换地图主题颜色(自定义) 可通过这个在线编辑得到自己想要的主题:https://developer.baidu.com/map/custom/ <div id="all ...
- 【leetcode】339. Nested List Weight Sum
原题 Given a nested list of integers, return the sum of all integers in the list weighted by their dep ...
- ELK6.x_Kafka 安装配置文档
1. 环境描述 1.1. 环境拓扑 如上图所示:Kafka为3节点集群负责提供消息队列,ES为3节点集群.日志通过logstash或者filebeat传送至Kafka集群,再通过logstash发 ...