【CF888G】Xor-MST(最小生成树,Trie树)
【CF888G】Xor-MST(最小生成树,Trie树)
题面
题解
利用\(Kruskal\)或者\(Prim\)算法都很不好计算。
然而我们还有一个叫啥来着?\(B\)啥啥的算法,就叫\(B\)算法吧。
思想是对于每个点找到一条最小边,并且将这条边连上,不难证明每次至少连上了\(n/2\)个点。
再将这些联通块看做一个点继续重复这个过程,时间复杂度是\(log\)级别的。
我们从高位往低位看,如果我们按照\(01\)分类,根据上述的过程,不难得到,如果\(01\)两个集合都存在的话,它们之间一定会连上一条边,并且\(01\)分类后的两个集合一定在内部形成联通块,这就很好办了,直接分治递归处理,每次拿\(Trie\)算一下\(01\)分类后两个集合之间边的最小值然后给连上就好。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
#define ll long long
#define MAX 200200
#define pb push_back
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int n,a[MAX],tot;
struct Node{int ch[2];}t[MAX<<5];
void insert(int &x,int w,int p)
{
if(!x)x=++tot,t[x].ch[0]=t[x].ch[1]=0;
if(p==-1)return;
insert(t[x].ch[(w>>p)&1],w,p-1);
}
int Query(int x,int w,int p)
{
if(p==-1)return 0;int c=(w>>p)&1;
if(t[x].ch[c])return Query(t[x].ch[c],w,p-1);
else return Query(t[x].ch[c^1],w,p-1)^(1<<p);
}
ll Solve(vector<int> v,int p)
{
if(!v.size()||p==-1)return 0;
vector<int> d[2];int ret=0,rt;
for(int i:v)d[(i>>p)&1].pb(i);
if(d[0].size()&&d[1].size())
{
ret=1<<(p+1);rt=tot=0;
for(int i:d[0])insert(rt,i,30);
for(int i:d[1])ret=min(ret,Query(rt,i,30));
}
return ret+Solve(d[0],p-1)+Solve(d[1],p-1);
}
int main()
{
n=read();vector<int> a;
for(int i=1;i<=n;++i)a.pb(read());
printf("%I64d\n",Solve(a,30));
return 0;
}
【CF888G】Xor-MST(最小生成树,Trie树)的更多相关文章
- cf888G. Xor-MST(Boruvka最小生成树 Trie树)
题意 题目链接 给出\(n\)点,每个点有一个点权\(a[i]\),相邻两点之间的边权为\(a[i] \oplus a[j]\),求最小生成树的值 Sol 非常interesting的一道题,我做过两 ...
- HDU 4825 Xor Sum (trie树处理异或)
Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)Total S ...
- HDU4825 Xor Sum(贪心+Trie树)
Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometheus 将向 Zeu ...
- Xor - Trie树
题目描述 求一棵带边权的树的一条最大 Xor 路径的值.这里的"路径"不一定从根到叶子结点,中间一段路径只要满足条件也可以. 输入格式 第一行,一个整数 N ,表示一颗树有 N 个 ...
- 【CF888G】Xor-MST Trie树(模拟最小生成树)
[CF888G]Xor-MST 题意:给你一张n个点的完全图,每个点有一个权值ai,i到j的边权使ai^aj,求这张图的最小生成树. n<=200000,ai<2^30 题解:学到了求最小 ...
- [CF888G] Xor-mst (Trie 树,最小生成树)
题目链接 Solution \(Trie\) 树 + 启发式合并. 考虑到是异或,于是按位贪心.让高位的尽量相同. 然后要计算每棵子树的代价,似乎并没有很好的方法?? 于是只能启发式合并. 对于每一个 ...
- usaco6.1-Cow XOR:trie树
Cow XOR Adrian Vladu -- 2005 Farmer John is stuck with another problem while feeding his cows. All o ...
- CF888G Xor-MST 生成树、分治、Trie树合并
传送门 第一次接触到Boruvka求最小生成树 它的原版本是:初始每一个点构成一个连通块,每一次找到每一个连通块到其他的连通块权值最短的边,然后合并这两个连通块.因为每一次连通块个数至少减半,所以复杂 ...
- 51nod 1295 XOR key (可持久化Trie树)
1295 XOR key 题目来源: HackerRank 基准时间限制:1.5 秒 空间限制:262144 KB 分值: 160 难度:6级算法题 给出一个长度为N的正整数数组A,再给出Q个查 ...
随机推荐
- opengl基础
opengl opengl是一个由Khronos组织制定并维护的规范(Specification) .是一系列的图形软件编程接口,和gdi类似.opengl有很多封装的库最有名的GLFW库.接下来很多 ...
- 《杜增强讲Unity之Tanks坦克大战》8-子弹碰撞处理
8 子弹碰撞处理 为了处理子弹打到坦克的伤害我们在这里新建一个Shell.cs 子弹有两种情况,碰到坦克炸开,没有碰到坦克则过2s子弹销毁. void Start () { Destroy (game ...
- UVa 10055
说一下犯错的地方: 1)没有注意数据范围,题目中是The input numbers are not greater than balabalabala. 而这个32位的int类型恰好装不下2^32, ...
- 02_python内置模块_timeit
timeit模块可以用来测试一小段python代码的执行速度. (1)timeit.Timer(stmt='pass', setup='pass', timer=<timer function& ...
- centos下部署禅道流程
原文摘录:https://www.jianshu.com/p/71e9dab130a5 下面将我在Linux系统下搭建禅道服务的过程分享给大家. 第一步:下载禅道 Linux中可以用以下命令来下载安装 ...
- centos7安装oracle亲测可用
http://www.linuxidc.com/Linux/2016-04/130559p2.htm
- 互评Beta版本——Thunder组爱阅app(探路者团队测评)
基于NABCD评论作品,及改进建议 每个小组评论其他小组beta发布的作品. 1.根据(不限于)NABCD评论作品的选题; N(Need,需求):在Beta中加入了书友QQ群,以及反馈建议,更好的 ...
- Linux 下Web环境搭建————redis
1.安装编译工具(yum -y install make gcc gcc-c++ ncurses-devel)2 2.安装tcl依赖 yum -y install tcl 3.上传redis安装包并解 ...
- Codeforces Round #284 (Div. 1) C. Array and Operations 二分图最大匹配
题目链接: http://codeforces.com/problemset/problem/498/C C. Array and Operations time limit per test1 se ...
- Reaction to 构造之法 of Software Engineering From The First Chapter toThe Fifth Chapter(补充版)
几个星期前,我阅读过一篇文章,一位老师教导自己的学生要积极地去阅读文学文献,其中,我很欣赏他的一句话:“Just think of liturature as if you're reading a ...