题目大意:给一个$n$个点的完全图,第$i$个点有点权$v_i$,一条边$x-y$的边权为$v_x\oplus v_y$,求最小生成树

题解:明显$Kruskal$和$Prim$都会$TLE$,有一种别的生成树的算法为$Sollin$。它对棵树找到离它最近的不连通的一棵树,对每棵树找好后若可以连这一条边就连接这条边。可以证明每次连通块个数至少减少一半,每次找最近的树可以枚举每一条边,复杂度$O(m)$,所以总复杂度是$O(m\log_2 n)$的。

在这一题中,可以用$Trie$来优化找最近的树的过程,可以优化为$O(\log_2 v)$,可以通过本题

卡点:发现两个点点权相同就不会产生贡献,于是就可以排序去重,记录最开始连通块个数时记录的是没有去重的点数,于是就一直连不完,一直$TLE$

C++ Code:

#include <algorithm>
#include <cctype>
#include <cstdio>
namespace __IO {
namespace R {
int x, ch;
inline int read() {
ch = getchar();
while (isspace(ch)) ch = getchar();
for (x = ch & 15, ch = getchar(); isdigit(ch); ch = getchar()) x = x * 10 + (ch & 15);
return x;
}
}
}
using __IO::R::read; #define maxn 200010
const int inf = 0x3f3f3f3f; namespace Trie {
#define M 29
#define N (maxn * (M + 2))
int V[N], nxt[2][N], root, idx; void modify(int x, int num = 1) {
int p = root;
for (register int i = M; ~i; i--) {
int tmp = x >> i & 1;
if (!nxt[tmp][p]) nxt[tmp][p] = ++idx;
p = nxt[tmp][p];
V[p] += num;
}
} int query(int x) {
int p = root, res = 0;
for (register int i = M; ~i; i--) {
int tmp = x >> i & 1;
if (V[nxt[tmp][p]]) p = nxt[tmp][p];
else p = nxt[!tmp][p], res |= 1 << i;
}
return res;
}
#undef N
#undef M
} int n, num;
std::pair<int, int> M[maxn];
int s[maxn], rnk[maxn];
long long ans; int f[maxn];
int find(int x) {return x == f[x] ? x : (f[x] = find(f[x]));} inline bool cmp(int a, int b) {return f[a] < f[b];}
int main() {
n = read();
for (int i = 1; i <= n; i++) s[i] = read();
n = (std::sort(s + 1, s + n + 1), std::unique(s + 1, s + n + 1) - s - 1);
for (int i = 1; i <= n; i++) {
rnk[i] = f[i] = i;
Trie::modify(s[i]);
}
num = n - 1;
while (num) {
for (int i = 1; i <= n; i++) find(i);
std::sort(rnk + 1, rnk + n + 1, cmp);
for (int i = 1; i <= n; i++) M[i] = std::make_pair(i, inf);
for (int l = 1, r, father; l <= n; l = r + 1) {
father = f[rnk[r = l]];
while (r < n && father == f[rnk[r + 1]]) r++;
for (int i = l; i <= r; i++) Trie::modify(s[rnk[i]], -1);
for (int i = l; i <= r; i++) {
int val = Trie::query(s[rnk[i]]), pos = std::lower_bound(s + 1, s + n + 1, s[rnk[i]] ^ val) - s;
if (val < M[father].second) M[father] = std::make_pair(pos, val);
}
for (int i = l; i <= r; i++) Trie::modify(s[rnk[i]]);
}
for (int i = 1; i <= n; i++) {
int x = find(i), y = find(M[i].first);
if (x != y) {
f[x] = y;
ans += M[i].second;
num--;
}
}
}
printf("%lld\n", ans);
return 0;
}

  

[CF888G]Xor-MST的更多相关文章

  1. CF888G Xor-MST 解题报告

    CF888G Xor-MST 题意翻译 给定一个\(n\)个节点的完全图,每个节点有个编号\(a_i\),节点\(i\)和节点\(j\)之间边的权值为\(a_i\ xor\ a_j\),求该图的最小生 ...

  2. hdu-5683 zxa and xor (位运算)

    题目链接: zxa and xor Time Limit: 16000/8000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Othe ...

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

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

  4. CF888G Xor-MST[最小生成树+01trie]

    前注:关于这题,本人的解法暂时没有成功通过此题,原因是被卡常了.可能需要等待某种机缘来请人调试. 类似uoj的一道题(新年的繁荣),不过是一个有些简单的版本. 因为是完全图,有没有办法明显优化建边,所 ...

  5. [LeetCode] Maximum XOR of Two Numbers in an Array 数组中异或值最大的两个数字

    Given a non-empty array of numbers, a0, a1, a2, … , an-1, where 0 ≤ ai < 231. Find the maximum re ...

  6. 二分+DP+Trie HDOJ 5715 XOR 游戏

    题目链接 XOR 游戏 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  7. POJ1679 The Unique MST[次小生成树]

    The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28673   Accepted: 10239 ...

  8. BZOJ 2115 【Wc2011】 Xor

    Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 ...

  9. 基于MST的立体匹配及相关改进(A Non-Local Cost Aggregation Method for Stereo Matching)

    怀着很纠结的心情来总结这篇论文,这主要是因为作者提虽然供了源代码,但是我并没有仔细去深究他的code,只是把他的算法加进了自己的项目.希望以后有时间能把MST这一结构自己编程实现!! 论文题目是基于非 ...

  10. xor和gates的专杀脚本

    前段时间的一次样本,需要给出专杀,应急中遇到的是linux中比较常见的两个家族gates和xor. 首先是xor的专杀脚本,xor样本查杀的时候需要注意的是样本的主进程和子进程相互保护(详见之前的xo ...

随机推荐

  1. spring源码-bean之增强初始化-3

    一.ApplicationContext的中文意思是“应用上下文”,它继承自BeanFactory接口,除了包含BeanFactory的所有功能之外,在国际化支持.资源访问(如URL和文件).事件传播 ...

  2. ThinkPHP开启设置子域名笔记

    一.ThinkPHP框架里 common下的config文件 'APP_SUB_DOMAIN_DEPLOY' => 1, // 开启子域名配置 'APP_SUB_DOMAIN_RULES' =& ...

  3. 「国庆训练&知识学习」图的最大独立集与拓展(Land of Farms,HDU-5556)

    题意 一个\(N*M\)的矩阵,其中"."代表空地,"0-9"代表古代建筑,我们如果选择了一个编号的古代建筑想要建立,那么对应就要将全部该编号的建筑建立起来,如 ...

  4. Python 更换国内pip源

    pip国内的一些镜像: 阿里云 http://mirrors.aliyun.com/pypi/simple/   中国科技大学 https://pypi.mirrors.ustc.edu.cn/sim ...

  5. 第七模块:项目实战一 第1章 项目实战:CRM客户关系管理系统开发

    01-crm介绍 02-权限系统介绍 03-第一版表结构设计 04-第二版表结构设计 05-orm中创建表结构 06-销售管理系统业务 07-销售管理系统权限信息录入 08-快速实现简单的权限控制的设 ...

  6. Python汉诺塔问题递归算法与程序

    汉诺塔问题: 问题来源:汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从上往下从小到大顺序摞着64片黄金圆盘.上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱 ...

  7. linux学习总结----shell编程

    ## 环境变量 ## 全局变量 ``` 常见的全局环境变量 PATH 指令的搜索路径 HOME 用户的家目录 LOGNAME 登录名 SHELL 脚本的类型 使用全局环境变量 echo $PATH 自 ...

  8. 1. 两数之和【Leetcode中国,by java】

    给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums = [2, 7, 11, 15], target ...

  9. SIG蓝牙mesh笔记3_网络结构

    目录 3. Mesh Networking 3.1 Bearers 承载层 3.2 Network Layer 网络层 3.2.3 Address validity 地址有效性 3.2.4 Netwo ...

  10. POJ 1755 Triathlon(线性规划の半平面交)

    Description Triathlon is an athletic contest consisting of three consecutive sections that should be ...