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 译文: 使 ...
随机推荐
- atomikos 优化JDBC性能
JDBC performance comes for free with our pooling DataSource classes: AtomikosDataSourceBean for XA-e ...
- C语言数组不知道输入几个整数以及输入一直到为0
输入一直到为0: ){ } 数组不知道输入几个整数: ],num=; for(;;num++){ scanf("%d",&array[num]); if(getchar() ...
- Https请求被中止: 未能创建 SSL/TLS 安全通道
可以参考https://www.cnblogs.com/ccsharp/p/3270344.html 和https://blog.csdn.net/baidu_27474941/article/det ...
- Ubuntu 14.04 64位机上不带CUDA支持的Caffe
Caffe是一个高效的深度学习框架.它既可以在CPU上执行也可以在GPU上执行. 下面介绍在Ubuntu上不带CUDA的Caffe配置编译过程: 1. 安装BLAS:$ sudo apt-g ...
- [转载]JDK、SDK、J2EE、J2SE、J2ME的区别
[转载]JDK.SDK.J2EE.J2SE.J2ME的区别 来源: https://www.cnblogs.com/liangyihui/p/5905875.html Java的名词真的是多啊 JDK ...
- 如何在含有json类型的字段上建立多列索引
废话不多,直接上图 如 : 表结构如图 那么我想在这三个字段上建立一个唯一索引,目的是为了防止重复插入数据, 1.首先,说明一下 data中的json中,key为 tagID 和 ...
- bootstrap 模态框在iphone微信内点击无效
<a data-toggle="modal" data-target="#wwww" href="" οnclick=" ...
- xposed获取context 的方法
// 应用被加壳,采用这种方式加载类 try { XposedHelpers.findAndHookMethod(Application.class, "attach", Cont ...
- B树Java代码实现以及测试
B树定义 B 树又叫平衡多路查找树.一棵m阶的B 树 (m叉树)的特性如下: 根节点至少有两个孩子 每个非根节点至少有M/2(上取整)个孩子,至多有M个孩子. 每个非根节点至少有M/2-1(上取整)个 ...
- 【appium】appium中的元素定位和基本操作
# coding=utf-8 from appium import webdriver import time from selenium.webdriver.support.ui import We ...