Description

为了方便你测试,本题为D题简化版。

You are given a complete undirected graph with nn vertices. A number aiai is assigned to each vertex, and the weight of an edge between vertices ii and jj is equal to ai ⊗ ajai ⊗ aj.

Calculate the weight of the minimum spanning tree in this graph.

Input

The first line contains nn(1≤n≤2×1051≤n≤2×105) — the number of vertices in the graph.

The second line contains nn integers a1,a2,⋯,an(0≤ai<230)a1,a2,⋯,an(0≤ai<230) — the numbers assigned to the vertices.

Output

Print one number — the weight of the minimum spanning tree in the graph.

Examples

Sample 1 Input

1
1

Sample 1 Output

0

Sample 2 Input

4
0 7 2 4

Sample 2 Output

9

Sample 3 Input

13
1 1 4 5 1 4 1 9 1 9 8 1 0

Sample 3 Output

15

这个是模板啦
相信大家肯定都被这种奇奇怪怪的完全图上搞事情的题目恶心过吧
我当初就遇到一个完全图里面边权是点权的gcd,然后求最短路的题目。
那个好像是一个线段树优化建图吧

这个是xor的边权。
xor,自然是想到了trie树啦
trie树能够非常自然的求出每一个点和其他点之间最小的边.
最小生成树有一个贪心,如果有一条目前最小的边,而且是连接了两个目前不连通的联通块,那么,选择它就是最优的。
我们先给每一个数排一个序。
在trie树中,我们把每一个数转化为二进制存放进去,然后对于每一个子树,我们记录它里面节点的下标的最大值和下标的最小值
这样我们就知道了这里面有什么数字了。
然后我们就枚举左子树里面的节点尝试和右子树里面的节点进行匹配

对于一个子树内的点,我们把他们先连起来,这样肯定不会不优的
然后就没啥了

//加油
#include<bits/stdc++.h>
#define ll long long
#define lc trie[x][0]
#define rc trie[x][1]
using namespace std;
ll a[5000001],L[5000001],R[5000001],trie[5000001][2],cnt,n;
inline ll read()
{
char c=getchar();ll a=0,b=1;
for(;c<'0'||c>'9';c=getchar())if(c=='-')b=-1;
for(;c>='0'&&c<='9';c=getchar())a=a*10+c-48;
return a*b;
}
void insert(ll &p,ll x,ll i)
{
if(p==0)p=++cnt;
L[p]=min(L[p],x);
R[p]=max(R[p],x);//记录这个区间所对应的下标
if(i<0)return;
ll val=(a[x]>>i)&1;
insert(trie[p][val],x,i-1);
}
ll ask(ll p,ll x,ll i)
{
if(i<0)return 0;
ll val=(x>>i)&1;
if(trie[p][val])return ask(trie[p][val],x,i-1);
return ask(trie[p][val^1],x,i-1)+(1<<i);
}
ll dfs(ll x,ll dep)
{
if(dep<0)return 0;
if(R[lc]&&R[rc])//判断是否有这个子树
{
ll res=1e9;
for(ll i=L[lc];i<=R[lc];i++)//枚举左子树的端点,去右子树匹配 因为是拍过序了,所以解决的数都会非常的靠近,只需要记录一下下标就好了
{
res=min(res,ask(rc,a[i],dep-1));
}
return dfs(lc,dep-1)+dfs(rc,dep-1)+res+(1<<dep);
}
if(R[lc])return dfs(lc,dep-1);
if(R[rc])return dfs(rc,dep-1);
return 0;
}
int main()
{
freopen("qingyuqaq.in","r",stdin);
freopen("qingyuqaq.out","w",stdout);
n=read();
for(ll i=1;i<=n;i++)
{
a[i]=read();
}
sort(a+1,a+1+n);
memset(L,30,sizeof(L));
ll root=0;
for(ll i=1;i<=n;i++)insert(root,i,30);
cout<<dfs(root,30)<<endl;
return 0;
}

D 算法模板(Boruvka's Algorithm)的更多相关文章

  1. Tarjan 算法&模板

    Tarjan 算法 一.算法简介 Tarjan 算法一种由Robert Tarjan提出的求解有向图强连通分量的算法,它能做到线性时间的复杂度. 我们定义: 如果两个顶点可以相互通达,则称两个顶点强连 ...

  2. POJ 1273 Drainage Ditches(网络流dinic算法模板)

    POJ 1273给出M条边,N个点,求源点1到汇点N的最大流量. 本文主要就是附上dinic的模板,供以后参考. #include <iostream> #include <stdi ...

  3. poj 1274 The Perfect Stall【匈牙利算法模板题】

    The Perfect Stall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20874   Accepted: 942 ...

  4. 最短路径---dijkstra算法模板

    dijkstra算法模板 http://acm.hdu.edu.cn/showproblem.php?pid=1874 #include<stdio.h> #include<stri ...

  5. UVA-11183 Teen Girl Squad (最小树形图、朱刘算法模板)

    题目大意:给一张无向图,求出最小树形图. 题目分析:套朱-刘算法模板就行了... 代码如下: # include<iostream> # include<cstdio> # i ...

  6. hdu-3068-最长回文(manacher算法模板)

    题目链接 /* Name:hdu-3068-最长回文 Copyright: Author: Date: 2018/4/24 16:12:45 Description: manacher算法模板 */ ...

  7. hdu 2063 过山车 (最大匹配 匈牙利算法模板)

    匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名.匈牙利算法是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最 ...

  8. BZOJ1878[SDOI2009]HH的项链+莫队算法模板

    题意:多次询问,求在一个区间中,有多少种珠子: 思路:莫队算法模板题目: 参考:https://www.cnblogs.com/RabbitHu/p/MoDuiTutorial.html #inclu ...

  9. [算法模板]FFT-快速傅里叶变换

    [算法模板]FFT-快速傅里叶变换 感谢ZYW聚聚为我们讲解FFT~ 思路 我懒,思路和证明部分直接贴链接: rvalue LSJ-FFT与NTT基础 代码 主要思想是利用了单位根特殊的性质(n次单位 ...

  10. [算法模板]Kruskal重构树

    [算法模板]Kruskal重构树 kruskal重构树是一个很常用的图论算法.主要用于解决u->v所有路径上最长边的最小值,就是找到\(u->v\)的一条路径,使路径上的最长边最小. 图片 ...

随机推荐

  1. 从零开始整SpringBoot-工具与插件

    工具 工具 名称 地址 IDEA https://www.jetbrains.com/idea/ JDK1.8 https://www.oracle.com/java/technologies/jav ...

  2. Linux系统运维之MYSQL数据库集群部署(主主互备)

    一.介绍 既然是部署MYSQL高可用集群环境,就要介绍下MYSQL Replication,MYSQL Replication是MYSQL自带的一个主从复制功能,也就是一台MYSQL服务器向另外一台M ...

  3. Kubernetes(k8s) Web-UI界面(一):部署和访问仪表板(Dashboard)

    目录 一.系统环境 二.前言 三.仪表板(Dashboard)简介 四.部署Kubernetes仪表板(Dashboard) 五.访问Kubernetes仪表板(Dashboard) 5.1 使用to ...

  4. 园子的商业化努力:欢迎参加DataFun联合行行AI举办的数据智能创新与实践人工智能大会

    大家好,今年是园子商业化生死攸关的一年,正在艰难而努力地向前推进,今天在首页发布一篇大会推广博文,望谅解. DataFun联合行行AI举办第四届"数据智能创新与实践人工智能大会", ...

  5. js中数组的方法,32种方法

    数组的32中方法=>{ 1.push(): 在数组末尾添加一个或多个元素,并返回修改后的数组. let fruits = ['apple', 'banana', 'orange']; fruit ...

  6. [HUBUCTF 2022 新生赛]simple_RE

    [HUBUCTF 2022 新生赛]simple_RE 查壳,64位 找main函数,F5查看伪代码,简单分析一下 int __cdecl main(int argc, const char **ar ...

  7. C语言基础--字符串

    文章目录 前言 一.数组 1.一维数组的创建 2.数组的索引 3.数组的调用 3.1 单个输出 3.2多个输出 二.字符串的创建 1.字符串的创建 2.字符串的输出 三.总结 前言 C语言中,有整型. ...

  8. Easygraph:全面高效的图分析与社会计算开源工具

    前言图是对事物之间关系的一种原生的表达,利用图可以深入直接地认识世界中的关联.社交网络.交易数据.知识图谱.交通运输.生物技术等都是图数据的典型应用.社交网络是一种特殊的图数据,它建立在图网络的基础上 ...

  9. 记录一次线上服务CPU飙高问题

    2023.07.20 20:01:38线上一个服务发生了CPU过高的告警, 看告警信息当前的CPU使用率已经达到了82.65%,问题已经很严重,赶紧开始排查起来.来复盘下如何排查这类问题, 一.排查方 ...

  10. 【go语言】2.1.1 变量,常量和数据类型

    Go 语言中,变量是存储数据的基本单位,常量则是固定不变的数据.每个变量和常量都有其对应的数据类型. 变量 在 Go 语言中,你可以使用 var 关键字来声明一个变量: var name string ...