题意:给定 n 个结点的无向完全图。每个点有一个点权为 ai。连接 i 号结点和 j 号结点的边的边权为 ai ⊕ aj。求这个图的 MST 的权值。

题解:异或最小生成树+01trie
Boruvka算法,求最小生成树的另一种方法,每一次选择连通块之间最小的边,然后连接两个连通块,我们可以用这种思想来求mst。而另外两种求mst的,肯定得n2预处理完全图的边权,必然超时。

对于异或,我们首先想到01trie来维护异或和。

我们先将每一个点按照权值从高位到低位插入01trie, 连接的话就是叶子结点之间通过lca相连了,由于我们要求mst,肯定希望两点的异或值越小越好,也就是高位越深越好,那么就是lca越深越好了,这就是为什么我们一开始选择从高位到低位插入01trie的原因。从低到高插一般都是要修改点权的情况。

接下来我们考虑dfs整个01trie,对于一个lca结点,枚举其左子树的所有叶子结点,在右子树中找到最小的异或边权,进行合并即可(Boruvka思想的体现)。

答案就是这些边的和。当然我们将点权从小到大加入01trie中,这样一个连通块始终在一个连续区间内,方便我们dfs。

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<fstream>
#include<set>
#include<map>
#include<sstream>
#include<iomanip>
#define ll long long
using namespace std;
const int maxn = 2e5 + 5;int cnt, siz[maxn * 30], nex[maxn * 30][2];
int n, a[maxn], rt;
void insert(int x) {int p = 0;for (int i = 30; i >= 0; i--) {int c = (x >> i) & 1;if (!nex[p][c]) nex[p][c] = ++cnt;  // 如果没有,就添加结点p = nex[p][c];siz[p]++;}
}
ll query(int o, int x, int dp) {             //传进的o已经是右子树的结点if (dp < 0) return 0;ll ans = 1 << dp;                        //别漏for (int i = dp - 1; i >= 0; i--) {int c = (x >> i) & 1;if (nex[o][c]) o = nex[o][c];else o = nex[o][c ^ 1], ans |= 1 << i;}return ans;
}
ll re;
void dfs(int o, int l, int r, int dp) {if (dp < 0) return;if (nex[o][0] && nex[o][1]) {int mid = l + siz[nex[o][0]] - 1;ll ans = 1e18;dfs(nex[o][0], l, mid, dp - 1);dfs(nex[o][1], mid + 1, r, dp - 1);for (int i = l; i <= mid; i++) {ans = min(ans, query(nex[o][1], a[i], dp - 1));}re += ans;}else if (nex[o][0]) dfs(nex[o][0], l, r, dp - 1);else if (nex[o][1]) dfs(nex[o][1], l, r, dp - 1);
}int main() {scanf("%d", &n);for (int i = 1; i <= n; i++) scanf("%d", &a[i]);sort(a + 1, a + n + 1);for (int i = 1; i <= n; i++) insert(a[i]);dfs(1, 1, n, 30);printf("%lld\n", re);return 0;
}

CodeForces 888G Xor-MST (异或最小生成树+01trie)相关推荐

  1. CodeForces - 888G Xor-MST(贪心+字典树+最小生成树)

    题目链接:点击查看 题目大意:给出 nnn 个点,任意两个点之间的边权为 ai⊕aja_i\oplus a_jai​⊕aj​,求最小生成树 题目分析:去年多校写过一样的模型,再拿出来写一遍回顾一下:牛 ...

  2. ML之NN:利用神经网络的BP算法解决XOR类(异或非)问题(BP solve XOR Problem)

    ML之NN:利用神经网络的BP算法解决XOR类(异或非)问题(BP solve XOR Problem) 目录 输出结果 实现代码 输出结果 实现代码 #BP solve XOR Problem im ...

  3. C++xor cipher异或密码算法(附完整源码)

    xor cipher异或密码的算法 xor cipher异或密码的完整源码(定义,实现,main函数测试) xor cipher异或密码的完整源码(定义,实现,main函数测试) #include & ...

  4. B Graph(异或最小生成树)

    Graph 思路 图是联通的,并且加边的时候要保证环一定是异或值为0,所以我们可以保证从一个点到另一个点的路径异或值是不变的,这个时候就简单了,不就是一个异或最小生成树了嘛. 我们只要预处理一下,任选 ...

  5. G. Xor-MST(异或最小生成树)

    G. Xor-MST 思路 异或最小生成树,这里采用了一种分治的方法来贪心求解最值: 首先我们对所有的点权值从小到大排个序,从高位开始在中间找到一个这个位置上的0,10,10,1分界点分成两个集合,然 ...

  6. 【转】The XOR Texture 异或纹理(Lode's Computer Graphics Tutorial)

    The XOR Texture 异或纹理 说明 最近在做纹理合成和传输的相关研究.本文是我在淘纹理合成相关材料时偶然得到,觉得这个纹理合成过程挺有意思,做了一些简单的翻译.因为是本人的第一篇随笔,所以 ...

  7. Codeforces Round #715 (Div. 1) C. Complete the MST 补图 + 思维 + 最小生成树

    传送门 文章目录 题意: 思路 题意: 给你一张nnn个点mmm个边的图,mmm条边是给定的,要求你给未给定的边赋值一个边权,使得所有边权异或和为000,求所有满足这种情况的图中最小生成树边权和最小的 ...

  8. Codeforces.888G.Xor-MST(Borůvka算法求MST 贪心 Trie)

    题目链接 \(Description\) 有一张\(n\)个点的完全图,每个点的权值为\(a_i\),两个点之间的边权为\(a_i\ xor\ a_j\).求该图的最小生成树. \(n\leq2*10 ...

  9. Educational Codeforces Round 9 F. Magic Matrix 最小生成树

    F. Magic Matrix 题目连接: http://www.codeforces.com/contest/632/problem/F Description You're given a mat ...

最新文章

  1. python怎么让摄像头图像暂停然后在启动_双目摄像头测量距离
  2. k8s中几种port介绍
  3. 超级直播sop直播源.zip_双11首场虚拟直播,天猫超级直播开创直播新玩法
  4. 3 软件测试对象,查找条件对象By—Selenium自动化测试指南(3)
  5. android抽屉屏幕右滑,android - Android - 使滑动抽屉从左向右滑动 - 堆栈内存溢出...
  6. Codeforces Round #148 (Div. 2)
  7. python执行循环内存变大_python – 为什么我的循环在每次迭代时需要更多内存?...
  8. 机器成为家人!华为发布2025十大趋势展望...
  9. halcon测量两条线距离_三角测量算法:过滤可能的错误点
  10. stringbuilder为什么线程不安全_String Builder 为什么线程不安全?
  11. 凸优化第三章凸函数 作业题
  12. C-Free注册码,密钥,到期解决办法
  13. MySQL的JDBC驱动8.0配置
  14. IIS网站发布详细流程
  15. 人工智能(Artificial Intelligence-AI)、机器学习(Machine Learning)、深度学习(Deep Learning)之间区别
  16. Android给文件改后缀名
  17. linux 安装toolchain工具
  18. 【Linux】进程状态的理解
  19. PMP在线完成续证和缴费步骤
  20. 小米手机市场份额为何下降

热门文章

  1. EOJ 3260:袋鼠妈妈找孩子
  2. 爬取新浪新闻[内容笔记代码整理]
  3. 巧用WhatsUp监控机房温度
  4. 震源机制(Focal Mechanism)之断层基本知识
  5. 2022-03-03每日刷题打卡
  6. VeryCD挥别影视做游戏 月入亿元转型成功
  7. 内网远程桌面控制软件推荐
  8. c语言人民币最小张数编程,人民币问题 (C语言代码)
  9. 合伙创业协议书标准模板
  10. RACSignal 冷信号和热信号底层实现分析