【CF888G】Xor-MST(最小生成树,Trie树)

题面

CF

洛谷

题解

利用\(Kruskal\)或者\(Prim\)算法都很不好计算。

然而我们还有一个叫啥来着?\(B\)啥啥的算法,就叫\(B\)算法吧。

思想是对于每个点找到一条最小边,并且将这条边连上,不难证明每次至少连上了\(n/2\)个点。

再将这些联通块看做一个点继续重复这个过程,时间复杂度是\(log\)级别的。

我们从高位往低位看,如果我们按照\(01\)分类,根据上述的过程,不难得到,如果\(01\)两个集合都存在的话,它们之间一定会连上一条边,并且\(01\)分类后的两个集合一定在内部形成联通块,这就很好办了,直接分治递归处理,每次拿\(Trie\)算一下\(01\)分类后两个集合之间边的最小值然后给连上就好。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<algorithm>
  7. #include<vector>
  8. using namespace std;
  9. #define ll long long
  10. #define MAX 200200
  11. #define pb push_back
  12. inline int read()
  13. {
  14. int x=0;bool t=false;char ch=getchar();
  15. while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
  16. if(ch=='-')t=true,ch=getchar();
  17. while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
  18. return t?-x:x;
  19. }
  20. int n,a[MAX],tot;
  21. struct Node{int ch[2];}t[MAX<<5];
  22. void insert(int &x,int w,int p)
  23. {
  24. if(!x)x=++tot,t[x].ch[0]=t[x].ch[1]=0;
  25. if(p==-1)return;
  26. insert(t[x].ch[(w>>p)&1],w,p-1);
  27. }
  28. int Query(int x,int w,int p)
  29. {
  30. if(p==-1)return 0;int c=(w>>p)&1;
  31. if(t[x].ch[c])return Query(t[x].ch[c],w,p-1);
  32. else return Query(t[x].ch[c^1],w,p-1)^(1<<p);
  33. }
  34. ll Solve(vector<int> v,int p)
  35. {
  36. if(!v.size()||p==-1)return 0;
  37. vector<int> d[2];int ret=0,rt;
  38. for(int i:v)d[(i>>p)&1].pb(i);
  39. if(d[0].size()&&d[1].size())
  40. {
  41. ret=1<<(p+1);rt=tot=0;
  42. for(int i:d[0])insert(rt,i,30);
  43. for(int i:d[1])ret=min(ret,Query(rt,i,30));
  44. }
  45. return ret+Solve(d[0],p-1)+Solve(d[1],p-1);
  46. }
  47. int main()
  48. {
  49. n=read();vector<int> a;
  50. for(int i=1;i<=n;++i)a.pb(read());
  51. printf("%I64d\n",Solve(a,30));
  52. return 0;
  53. }

【CF888G】Xor-MST(最小生成树,Trie树)的更多相关文章

  1. cf888G. Xor-MST(Boruvka最小生成树 Trie树)

    题意 题目链接 给出\(n\)点,每个点有一个点权\(a[i]\),相邻两点之间的边权为\(a[i] \oplus a[j]\),求最小生成树的值 Sol 非常interesting的一道题,我做过两 ...

  2. HDU 4825 Xor Sum (trie树处理异或)

    Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others)Total S ...

  3. HDU4825 Xor Sum(贪心+Trie树)

    Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometheus 将向 Zeu ...

  4. Xor - Trie树

    题目描述 求一棵带边权的树的一条最大 Xor 路径的值.这里的"路径"不一定从根到叶子结点,中间一段路径只要满足条件也可以. 输入格式 第一行,一个整数 N ,表示一颗树有 N 个 ...

  5. 【CF888G】Xor-MST Trie树(模拟最小生成树)

    [CF888G]Xor-MST 题意:给你一张n个点的完全图,每个点有一个权值ai,i到j的边权使ai^aj,求这张图的最小生成树. n<=200000,ai<2^30 题解:学到了求最小 ...

  6. [CF888G] Xor-mst (Trie 树,最小生成树)

    题目链接 Solution \(Trie\) 树 + 启发式合并. 考虑到是异或,于是按位贪心.让高位的尽量相同. 然后要计算每棵子树的代价,似乎并没有很好的方法?? 于是只能启发式合并. 对于每一个 ...

  7. usaco6.1-Cow XOR:trie树

    Cow XOR Adrian Vladu -- 2005 Farmer John is stuck with another problem while feeding his cows. All o ...

  8. CF888G Xor-MST 生成树、分治、Trie树合并

    传送门 第一次接触到Boruvka求最小生成树 它的原版本是:初始每一个点构成一个连通块,每一次找到每一个连通块到其他的连通块权值最短的边,然后合并这两个连通块.因为每一次连通块个数至少减半,所以复杂 ...

  9. 51nod 1295 XOR key (可持久化Trie树)

    1295 XOR key  题目来源: HackerRank 基准时间限制:1.5 秒 空间限制:262144 KB 分值: 160 难度:6级算法题   给出一个长度为N的正整数数组A,再给出Q个查 ...

随机推荐

  1. opengl基础

    opengl opengl是一个由Khronos组织制定并维护的规范(Specification) .是一系列的图形软件编程接口,和gdi类似.opengl有很多封装的库最有名的GLFW库.接下来很多 ...

  2. 《杜增强讲Unity之Tanks坦克大战》8-子弹碰撞处理

    8 子弹碰撞处理 为了处理子弹打到坦克的伤害我们在这里新建一个Shell.cs 子弹有两种情况,碰到坦克炸开,没有碰到坦克则过2s子弹销毁. void Start () { Destroy (game ...

  3. UVa 10055

    说一下犯错的地方: 1)没有注意数据范围,题目中是The input numbers are not greater than balabalabala. 而这个32位的int类型恰好装不下2^32, ...

  4. 02_python内置模块_timeit

    timeit模块可以用来测试一小段python代码的执行速度. (1)timeit.Timer(stmt='pass', setup='pass', timer=<timer function& ...

  5. centos下部署禅道流程

    原文摘录:https://www.jianshu.com/p/71e9dab130a5 下面将我在Linux系统下搭建禅道服务的过程分享给大家. 第一步:下载禅道 Linux中可以用以下命令来下载安装 ...

  6. centos7安装oracle亲测可用

    http://www.linuxidc.com/Linux/2016-04/130559p2.htm

  7. 互评Beta版本——Thunder组爱阅app(探路者团队测评)

    基于NABCD评论作品,及改进建议 每个小组评论其他小组beta发布的作品. 1.根据(不限于)NABCD评论作品的选题;   N(Need,需求):在Beta中加入了书友QQ群,以及反馈建议,更好的 ...

  8. Linux 下Web环境搭建————redis

    1.安装编译工具(yum -y install make gcc gcc-c++ ncurses-devel)2 2.安装tcl依赖 yum -y install tcl 3.上传redis安装包并解 ...

  9. 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 ...

  10. Reaction to 构造之法 of Software Engineering From The First Chapter toThe Fifth Chapter(补充版)

    几个星期前,我阅读过一篇文章,一位老师教导自己的学生要积极地去阅读文学文献,其中,我很欣赏他的一句话:“Just think of liturature as if you're reading a ...