D 算法模板(Boruvka's Algorithm)
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)的更多相关文章
- Tarjan 算法&模板
Tarjan 算法 一.算法简介 Tarjan 算法一种由Robert Tarjan提出的求解有向图强连通分量的算法,它能做到线性时间的复杂度. 我们定义: 如果两个顶点可以相互通达,则称两个顶点强连 ...
- POJ 1273 Drainage Ditches(网络流dinic算法模板)
POJ 1273给出M条边,N个点,求源点1到汇点N的最大流量. 本文主要就是附上dinic的模板,供以后参考. #include <iostream> #include <stdi ...
- poj 1274 The Perfect Stall【匈牙利算法模板题】
The Perfect Stall Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 20874 Accepted: 942 ...
- 最短路径---dijkstra算法模板
dijkstra算法模板 http://acm.hdu.edu.cn/showproblem.php?pid=1874 #include<stdio.h> #include<stri ...
- UVA-11183 Teen Girl Squad (最小树形图、朱刘算法模板)
题目大意:给一张无向图,求出最小树形图. 题目分析:套朱-刘算法模板就行了... 代码如下: # include<iostream> # include<cstdio> # i ...
- hdu-3068-最长回文(manacher算法模板)
题目链接 /* Name:hdu-3068-最长回文 Copyright: Author: Date: 2018/4/24 16:12:45 Description: manacher算法模板 */ ...
- hdu 2063 过山车 (最大匹配 匈牙利算法模板)
匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名.匈牙利算法是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最 ...
- BZOJ1878[SDOI2009]HH的项链+莫队算法模板
题意:多次询问,求在一个区间中,有多少种珠子: 思路:莫队算法模板题目: 参考:https://www.cnblogs.com/RabbitHu/p/MoDuiTutorial.html #inclu ...
- [算法模板]FFT-快速傅里叶变换
[算法模板]FFT-快速傅里叶变换 感谢ZYW聚聚为我们讲解FFT~ 思路 我懒,思路和证明部分直接贴链接: rvalue LSJ-FFT与NTT基础 代码 主要思想是利用了单位根特殊的性质(n次单位 ...
- [算法模板]Kruskal重构树
[算法模板]Kruskal重构树 kruskal重构树是一个很常用的图论算法.主要用于解决u->v所有路径上最长边的最小值,就是找到\(u->v\)的一条路径,使路径上的最长边最小. 图片 ...
随机推荐
- 国产MCU兆易GD32实现矩阵按键扫描
一.矩阵键盘 为了减少I/O口的占用,通常将按键排列成矩阵形式.在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接.使用8个io口来进行16个按键的控制读取,可以减 ...
- FFmpeg合并视频和音频文件
使用IDM下载Bilibili的视频会出现音视频分离的问题,通常文件大的是视频(没有声音),文件小的是单独的音频. 将两个文件都下载下来后,可以使用FFmpeg将其合并成一个视频文件.首先去FFmpe ...
- SpringBoot 如何优雅的进行全局异常处理?
在SpringBoot的开发中,为了提高程序运行的鲁棒性,我们经常需要对各种程序异常进行处理,但是如果在每个出异常的地方进行单独处理的话,这会引入大量业务不相关的异常处理代码,增加了程序的耦合,同时未 ...
- Unity的OnOpenAsset:深入解析与实用案例
Unity OnOpenAsset 在Unity中,OnOpenAsset是一个非常有用的回调函数,它可以在用户双击资源文件时自动打开一个编辑器窗口.这个回调函数可以用于自定义资源编辑,提高工作效率. ...
- 给程序员准备的“蜜糍”--SOD框架简介
注:本文是SOD框架源码仓库的首页介绍,原文地址 一.框架介绍 1,SOD框架是什么? 以前有一个著名的国产化妆品"大宝SOD密",SOD框架虽然跟它没有什么关系,但是名字的确受到 ...
- sensor有点意思之RCCB传感器
1.RCCB sensor 无意中看到一种特殊规格的传感器,RCCB (Red-Clear-Clear-Blue)sensor,第一次听到这个名词,咱不知道就查一查,检索到RCCB sensor是一种 ...
- 华为P9黑屏的解决方案-更换屏幕
解决办法(系统软件) 1.回退系统版本,b198或者b139固件. 2.升级版本,到最新版本.新版本使用时并没有发现这个问题. 解决方法(系统设置) 点开设置-电池-选择进入超级省电模式,然后退出超级 ...
- Confluence 挖矿病毒 升级现有系统
Confluence 挖矿病毒 升级现有系统 背景 服务器很多服务都很卡,通过检查发现是一起运行的confluence异常,被挖矿病毒挖矿,华为云和官网也有说明. 知道问题之后,处理方式就是将现有的问 ...
- WebSSH之录屏安全审计(三)
第一篇:Gin+Xterm.js实现WebSSH远程Kubernetes Pod(一) 第二篇:WebSSH远程管理Linux服务器.Web终端窗口自适应(二) 支持用户名密码认证 支持SSH密钥认证 ...
- python:map函数
参考示例 def test(x): return x * 2 mylist = [1, 2, 3, 4, 5] result = list(map(test, mylist)) print(resul ...