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. 10分钟讲清int 和 Integer 的区别

    其实在Java编程中,int和Integer都是非常常用的数据类型,但它们之间存在一些关键的区别,特别是在面向对象编程中.所以接下来,就让我们一起来探讨下关于int和Integer的区别这个问题吧. ...

  2. Python运维开发之路《WEB框架:Django》

    一.Web框架的本质 所有的web框架.web请求:本质上都是:socket 浏览器:socket客户端 服务器:socket服务端 1. socket服务端 import socket def ha ...

  3. C# - DTO 的字符串表达

    第一阶段 重写 DTO 的 ToString() 方法.利用 Newtonsoft.Json 序列化 DTO 对象. 第二阶段 为 DTO 设置基类,重写基类的 ToString() 方法.利用 Sy ...

  4. node使用jsonwebtoken生成token与验证是否过期

    场景 我们可以使用 cookie,session,token 来做鉴权. 下面我们来看一下, 如何使用 token 来做鉴权 jwt.sign 的简单介绍 npm install jsonwebtok ...

  5. Ubuntu虚拟机教程

    1.下载ubuntu镜像 可以去中科大镜像站下载(本次下载20.04版本,不同版本操作会有差异,建议保持一致) https://mirrors.ustc.edu.cn/ 点击如图所示的按钮下载 2.v ...

  6. Mysql基础5-用户及权限管理

    一.介绍 DCL:Data Control Language(数据控制语言),用来管理数据库用户,控制数据库的访问,权限. 二.用户管理 1.查询用户 语法: 1.use mysql; 2.selec ...

  7. Unity UGUI的CanvasScaler(画布缩放器)组件的介绍及使用

    Unity UGUI的CanvasScaler(画布缩放器)组件的介绍及使用 1. 什么是CanvasScaler组件? CanvasScaler是Unity中UGUI系统中的一个组件,用于控制画布的 ...

  8. 编码技巧 --- 使用dynamic简化反射

    引言 dynamic 是 Framework 4.0 就出现特性,它的出现让 C# 具有了弱语言类型的特性.编译器在编译的时候不再对类型进行检查,默认 dynamic 对象支持开发者想要的任何特性. ...

  9. 这可能是前端处理excel最好的工具了

    大家好,我是程序视点的小二哥! 今天小二哥要分享的是一个纯前端实现读取和导出excel文件的工具库:ExcelJS ExcelJs 简介 功能十分简单: 读取,操作并写入电子表格数据和样式到 XLSX ...

  10. linux系统下python中的tkinter库

    打开终端,输入如下命令: sudo apt-get update sudo apt-get install python3-tk