链接: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. JS基础_函数作用域练习

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. VBA常量(八)

    常量是一个命名的内存位置,用于保存脚本执行期间固定(无法更改)的值.如果用户试图更改常量值,则脚本执行结束时会出现错误.常量声明与声明变量相同. 以下是命名常量的规则 - 常量名称必须使用一个字母作为 ...

  3. VBA教程(一)

    VBA代表Visual Basic for Applications,它是一个来自Microsoft的事件驱动的编程语言. 现在它主要用于Microsoft Office应用程序,如MSExcel,M ...

  4. 【小知识点】如何通过jq获取textarea的值

    textarea和input本质差不多,只不过input是一行文本,textarea是多行文本. 所以获取textarea的值的方法和获取input的值的方法是一致的, $('textarea').v ...

  5. el-select 可选择可输入

    <el-select v-model="saveWardForm.wardCode" placeholder="" filterable @blur=&q ...

  6. Hibernate入门第一讲——Hibernate框架的快速入门

    Hibernate框架的概述 什么是框架? 框架指的是软件的半成品,已经完成了部分功能. JavaEE开发的三层架构 了解框架的基本概念之后,我们就来看看Hibernate框架处于JavaEE开发的经 ...

  7. EF方式增、删、改、查(基本使用)

    右击项目——添加——新建项——数据(C#)——选择ADO.NET实体数据模型——点击添加——然后根据实体数据模型向导来一步步的做. 用到的表 using System; using System.Da ...

  8. docker搭建单机ELK

    yum -y install epel-release yum -y install python-pip // 更新pip pip install --upgrade pip // 安装docker ...

  9. Linux命令——shutdown、halt、poweroff、reboot、cal、date

    shutdown shutdown在关机的时候会通知所有用户 shutdown –r now 现在重启 shutdown now 现在关机 shutdown +5 过5分钟关机 shutdown –c ...

  10. 详解分布式系统里session同步

    1.什么是session?什么又是cookie?他俩有啥联系和区别? 2.为什么要在多台服务器间进行session的共享同步? 3.以及有哪些方法来实现这个同步? 大家快搬板凳,老王开始扯淡咯~ 1. ...