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\)的一条路径,使路径上的最长边最小. 图片 ...
随机推荐
- C++面试八股文:std::deque用过吗?
某日二师兄参加XXX科技公司的C++工程师开发岗位第26面: 面试官:deque用过吗? 二师兄:说实话,很少用,基本没用过. 面试官:为什么? 二师兄:因为使用它的场景很少,大部分需要性能.且需要自 ...
- 前端Vue自定义带历史记录的搜索框组件searchBar 支持搜索输入框清空 搜索历史存储记录清除
前端Vue自定义带历史记录的搜索框组件searchBar 支持搜索输入框清空 搜索历史存储记录清除,下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/p ...
- 生成CSV文件的方法*(LIST集合为数据和生成的文件名)
/** * 生成csv文件 * @param pointsList 组织实体 * filename 生成的文件名 * list 要生成的数据 * @return */ public void Poin ...
- CF1829H Don't Blame Me题解
题意: 给定一个长度为 \(n\) 的数组,选择它的一个子序列(不一定要连续的),问有多少种选法使得它们 AND 的值的二进制表示法中有 \(k\) 个 \(1\). 思路: 这个题就是一个简单的 D ...
- zip文件结构
转starshine博客 一个zip文件由三个部分组成:压缩源文件数据区.压缩源文件目录区.压缩源文件目录结束标志 压缩源文件数据区: 50 4B 03 04:这是头文件标记(0x04034b50) ...
- Java扩展Nginx之六:两大filter
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是<Java扩展Nginx> ...
- Redis的设计与实现-总结
个人真的很喜欢这本书, 从对C语言一窍不通, 到发现C语言竟然如此简洁, 以至于我喜欢上了C! 对此前面的底层数据结构也读了几次, 大致整理了书里的内容, 后面的就粗略看了一下, 不再细细整理了. R ...
- 自学前端-HTML5+CSS-综合案例一-热词
综合案例一-热词 目录 综合案例一-热词 1.设计需求 2.设计所需标签和CSS样式 3.设计具体步骤 4.遇到的问题 设计图如下 1.设计需求 ①需要鼠标放上去有显示透明 ②需要点击后跳转到相应页面 ...
- Centos7快速安装Oracl11g
Centos7快速安装Oracle11g 一.解决虚拟机或低配置的云服务器上安装Oracle的方法有两种: 1)不用图形界面,采用静默方式安装,这种方法的技术难度比较大,Oracle的DBA经常采用这 ...
- Oracle分区表设置详解
Oracle分区表详解 Oracle建议单表超过2G就需要进行分表,一万数据大概3MB,单表最多分区为1024*1024-1个分区,我感觉够我们使用了哈 废话不多说,上示例,Oracle分表具体sql ...