[CF888G]Xor-MST
题目大意:给一个$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的更多相关文章
- CF888G Xor-MST 解题报告
CF888G Xor-MST 题意翻译 给定一个\(n\)个节点的完全图,每个节点有个编号\(a_i\),节点\(i\)和节点\(j\)之间边的权值为\(a_i\ xor\ a_j\),求该图的最小生 ...
- hdu-5683 zxa and xor (位运算)
题目链接: zxa and xor Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Othe ...
- Codeforces.888G.Xor-MST(Borůvka算法求MST 贪心 Trie)
题目链接 \(Description\) 有一张\(n\)个点的完全图,每个点的权值为\(a_i\),两个点之间的边权为\(a_i\ xor\ a_j\).求该图的最小生成树. \(n\leq2*10 ...
- CF888G Xor-MST[最小生成树+01trie]
前注:关于这题,本人的解法暂时没有成功通过此题,原因是被卡常了.可能需要等待某种机缘来请人调试. 类似uoj的一道题(新年的繁荣),不过是一个有些简单的版本. 因为是完全图,有没有办法明显优化建边,所 ...
- [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 ...
- 二分+DP+Trie HDOJ 5715 XOR 游戏
题目链接 XOR 游戏 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- POJ1679 The Unique MST[次小生成树]
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 28673 Accepted: 10239 ...
- BZOJ 2115 【Wc2011】 Xor
Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 ...
- 基于MST的立体匹配及相关改进(A Non-Local Cost Aggregation Method for Stereo Matching)
怀着很纠结的心情来总结这篇论文,这主要是因为作者提虽然供了源代码,但是我并没有仔细去深究他的code,只是把他的算法加进了自己的项目.希望以后有时间能把MST这一结构自己编程实现!! 论文题目是基于非 ...
- xor和gates的专杀脚本
前段时间的一次样本,需要给出专杀,应急中遇到的是linux中比较常见的两个家族gates和xor. 首先是xor的专杀脚本,xor样本查杀的时候需要注意的是样本的主进程和子进程相互保护(详见之前的xo ...
随机推荐
- spring源码-bean之增强初始化-3
一.ApplicationContext的中文意思是“应用上下文”,它继承自BeanFactory接口,除了包含BeanFactory的所有功能之外,在国际化支持.资源访问(如URL和文件).事件传播 ...
- ThinkPHP开启设置子域名笔记
一.ThinkPHP框架里 common下的config文件 'APP_SUB_DOMAIN_DEPLOY' => 1, // 开启子域名配置 'APP_SUB_DOMAIN_RULES' =& ...
- 「国庆训练&知识学习」图的最大独立集与拓展(Land of Farms,HDU-5556)
题意 一个\(N*M\)的矩阵,其中"."代表空地,"0-9"代表古代建筑,我们如果选择了一个编号的古代建筑想要建立,那么对应就要将全部该编号的建筑建立起来,如 ...
- Python 更换国内pip源
pip国内的一些镜像: 阿里云 http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.ustc.edu.cn/sim ...
- 第七模块:项目实战一 第1章 项目实战:CRM客户关系管理系统开发
01-crm介绍 02-权限系统介绍 03-第一版表结构设计 04-第二版表结构设计 05-orm中创建表结构 06-销售管理系统业务 07-销售管理系统权限信息录入 08-快速实现简单的权限控制的设 ...
- Python汉诺塔问题递归算法与程序
汉诺塔问题: 问题来源:汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从上往下从小到大顺序摞着64片黄金圆盘.上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱 ...
- linux学习总结----shell编程
## 环境变量 ## 全局变量 ``` 常见的全局环境变量 PATH 指令的搜索路径 HOME 用户的家目录 LOGNAME 登录名 SHELL 脚本的类型 使用全局环境变量 echo $PATH 自 ...
- 1. 两数之和【Leetcode中国,by java】
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums = [2, 7, 11, 15], target ...
- SIG蓝牙mesh笔记3_网络结构
目录 3. Mesh Networking 3.1 Bearers 承载层 3.2 Network Layer 网络层 3.2.3 Address validity 地址有效性 3.2.4 Netwo ...
- POJ 1755 Triathlon(线性规划の半平面交)
Description Triathlon is an athletic contest consisting of three consecutive sections that should be ...