链接: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(nlog⁡ai)。

#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树的应用;的更多相关文章

  1. 基于trie树做一个ac自动机

    基于trie树做一个ac自动机 #!/usr/bin/python # -*- coding: utf-8 -*- class Node: def __init__(self): self.value ...

  2. 基于trie树的具有联想功能的文本编辑器

    之前的软件设计与开发实践课程中,自己构思的大作业题目.做的具有核心功能,但是还欠缺边边角角的小功能和持久化数据结构,先放出来,有机会一点点改.github:https://github.com/chu ...

  3. hihocoder-1014 Trie树

    hihocoder 1014 : Trie树 link: https://hihocoder.com/problemset/problem/1014 题意: 实现Trie树,实现对单词的快速统计. # ...

  4. 洛谷P2412 查单词 [trie树 RMQ]

    题目背景 滚粗了的HansBug在收拾旧英语书,然而他发现了什么奇妙的东西. 题目描述 udp2.T3如果遇到相同的字符串,输出后面的 蒟蒻HansBug在一本英语书里面找到了一个单词表,包含N个单词 ...

  5. 通过trie树实现单词自动补全

    /** * 实现单词补全功能 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #incl ...

  6. #1014 Trie树

    本题主要是求构造一棵Trie树,即词典树用于统计单词. C#代码如下: using System; using System.Collections.Generic; using System.Lin ...

  7. Trie树-字典查找

    描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一本词典,于是小Hi就向小Ho提出了那个经典的问题: ...

  8. Trie树的创建、插入、查询的实现

    原文:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=28977986&id=3807947 1.什么是Trie树 Tr ...

  9. Trie树(c++实现)

    转:http://www.cnblogs.com/kaituorensheng/p/3602155.html http://blog.csdn.net/insistgogo/article/detai ...

  10. [转]双数组TRIE树原理

    原文名称: An Efficient Digital Search Algorithm by Using a Double-Array Structure 作者: JUN-ICHI AOE 译文: 使 ...

随机推荐

  1. 入手线段树 hdu1754

    今天学习了线段树的三个基本操作 建树 更新 查找 先理解下什么是线段树就这个题目而言 如果我们用普通的数组去存放 然后依次遍历访问的话 时间太多了线段树利用了二分的思想 把数据以段的形式进行储存 这样 ...

  2. opencv 加载pb

    1.错误1         Tensor's data type is not supported the type of Mul  is DF_Float 2.  错误2 type == " ...

  3. 基于微软hyper-v虚拟化服务器搭建方法和步骤整理

    基于Microsoft基础设施私有云计算搭建 摘要:私有云是指组织机构建设的专供自己使用的云平台,它所提供的服务不是供他人使用,而是供自己的内部人员或分支机构使用,不同于公有云,私有云部署在企业内部网 ...

  4. 阿里云 ecs win2016 FileZilla Server

     Windows Server 2016 下使用 FileZilla Server 安装搭建 FTP 服务 一.安装 Filezilla Server 下载最新版本的 Filezilla Server ...

  5. ORACLE 存储过程提高

    1.SQLCODE和SQLERRM 2.%TYPE和%ROWTYPE的使用 3.sql%rowcount的作用 1.SQLCODE和SQLERRM SQLCode:数据库操作的返回码,其中 --成功: ...

  6. Vue获取数据渲染完成事件

    主要代码是这两坨 this.nextTick(function(){ alert('数据已经更新') }); this.$nextTick(function(){ alert('v-for渲染已经完成 ...

  7. 什么是领域模型(domain model)?贫血模型(anaemic domain model)和充血模型(rich domain model)有什么区别

    领域模型是领域内的概念类或现实世界中对象的可视化表示,又称为概念模型或分析对象模型,它专注于分析问题领域本身,发掘重要的业务领域概念,并建立业务领域概念之间的关系. 贫血模型是指使用的领域对象中只有s ...

  8. jquery中的ajaxSetup

    在项目开发中如果我们想给某一个页面中的所有的ajax设置统一的参数的情况下,可以是使用ajaxSetup,非常好用 $.ajaxSetup({ type:'post', dataType:'json' ...

  9. winform中使用缓存

    文章:Winform里面的缓存使用 另外一篇文章:缓存-MemoryCache Class

  10. 《流畅的Python》Object References, Mutability, and Recycling--第8章

    Object References, Mutability, and Recycling 本章章节: Variables Are Not Boxes identity , Equality ,  Al ...