题目传送门

  这是一条通往vjudge的高速公路

  这是一条通往Codeforces的高速公路

题目大意

  给定一个$n$阶完全图,每个点有一个权值$a_{i}$,边$(i, j)$的权值是$(a_{i}\  xor\  a_{j})$。一个生成树的权值是各边的权值和。问最小生成树的权值。  

  设值域为$[0, 2^{k})$。

  当$k = 1$的时候,显然将点权为0的点之间互相连边,点权为1的点之间互相连边,中间随便连一条。

  当$k = x\ (x > 1)$的时候,将这些点按照二进制的第$k$位分成两个集合。因为这两集合中间的点互相连边,边权的第$k$位会被消掉,于是变成了$k = x - 1$的子问题。

  假如得到了它们的最优解,那么我只需要在两个连通块之间添加一条边权最小的边就行了。

  考虑怎么找这样一条边。

  我可以把其中一个集合中数插入Trie树,然后拿另一集合中的点的点权在Trie树中查最小异或和。

Code

 /**
* Codeforces
* Problem#888G
* Accepted
* Time: 327ms
* Memory: 49772k
*/
#include <bits/stdc++.h>
#ifndef WIN32
#define Auto "%lld"
#else
#define Auto "%I64d"
#endif
using namespace std;
typedef bool boolean; #define ll long long typedef class TrieNode {
public:
TrieNode* ch[]; TrieNode():ch({NULL, NULL}) { }
}TireNode; TrieNode pool[];
TrieNode* top = pool; TrieNode* newnode() {
top->ch[] = top->ch[] = NULL;
return top++;
} typedef class Trie {
public:
TrieNode* rt; Trie() {
top = pool;
rt = newnode();
} void insert(int x, int dep) {
int temp = << dep, d;
TrieNode *p = rt;
while (temp) {
d = (temp & x) ? () : ();
if (!p->ch[d])
p->ch[d] = newnode();
p = p->ch[d], temp = temp >> ;
}
} int query(int x, int dep) {
int temp = << dep, rt = , d;
TrieNode *p = this->rt;
while (temp) {
d = (temp & x) ? () : ();
if (p->ch[d])
p = p->ch[d];
else
p = p->ch[d ^ ], rt |= temp;
temp = temp >> ;
}
return rt;
}
}Trie; int n;
int *ar;
Trie t; inline void init() {
scanf("%d", &n);
ar = new int[(n + )];
for (int i = ; i <= n; i++)
scanf("%d", ar + i);
} ll dividing(int dep, int l, int r) {
if (!dep) return ar[l] ^ ar[r];
int tl = l, tr = r, mid, temp = << dep, mincost = << ;
while (tl <= tr) {
mid = (tl + tr) >> ;
if (ar[mid] & temp)
tr = mid - ;
else
tl = mid + ;
}
if (tr == l - || tr == r)
return dividing(dep - , l, r);
t = Trie();
for (int i = l; i <= tr; i++)
t.insert(ar[i], dep);
for (int i = tr + ; i <= r; i++)
mincost = min(mincost, t.query(ar[i], dep));
return mincost + dividing(dep - , l, tr) + dividing(dep - , tr + , r);
} inline void solve() {
sort(ar + , ar + n + );
printf(Auto"\n", dividing(, , n));
} int main() {
init();
solve();
return ;
}

Codeforces 888G Xor-MST - 分治 - 贪心 - Trie的更多相关文章

  1. Codeforces 1111C Creative Snap分治+贪心

    Creative Snap C. Creative Snap time limit per test 1 second memory limit per test 256 megabytes inpu ...

  2. 51nod1295 XOR key(可持久化trie)

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

  3. codeforces Gym 100338E Numbers (贪心,实现)

    题目:http://codeforces.com/gym/100338/attachments 贪心,每次枚举10的i次幂,除k后取余数r在用k-r补在10的幂上作为候选答案. #include< ...

  4. AcWing:105. 七夕祭(前缀和 + 中位数 + 分治 + 贪心)

    七夕节因牛郎织女的传说而被扣上了「情人节」的帽子. 于是TYVJ今年举办了一次线下七夕祭. Vani同学今年成功邀请到了cl同学陪他来共度七夕,于是他们决定去TYVJ七夕祭游玩. TYVJ七夕祭和11 ...

  5. [多校联考2019(Round 4 T1)][51nod 1295]Xor key(可持久化trie)

    [51nod 1295]Xor key(可持久化trie) 题面 给出一个长度为n的正整数数组A,再给出Q个查询,每个查询包括3个数,L, R, X (L <= R).求A[L] 至 A[R] ...

  6. [Codeforces 1214A]Optimal Currency Exchange(贪心)

    [Codeforces 1214A]Optimal Currency Exchange(贪心) 题面 题面较长,略 分析 这个A题稍微有点思维难度,比赛的时候被孙了一下 贪心的思路是,我们换面值越小的 ...

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

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

  8. Codeforces 888G(分治+trie)

    按位贪心,以当前考虑位是0还是1将数分成两部分,则MST中这两部分之间只会存在一条边,因为一旦有两条或以上的边,考虑两条边在原图中所成的环,显然这两条边有一条是环上的权值最大边,不会出现在MST中.则 ...

  9. Codeforces 437D The Child and Zoo - 树分治 - 贪心 - 并查集 - 最大生成树

    Of course our child likes walking in a zoo. The zoo has n areas, that are numbered from 1 to n. The ...

随机推荐

  1. ida6.8 android so调试

    献给还不会的同学. 我的设备 1.魅族手机,自带root功能 2.ida6.8 1.上传ida 目录下dbgsrv/android_server 到 手机上,这个目录自己可以修改,网上都用的adb p ...

  2. Linux平台Oracle 12.1.0.2 单实例安装部署

    主题:Linux平台Oracle 12.1.0.2 单实例安装部署 环境:RHEL 6.5 + Oracle 12.1.0.2 需求:安装部署OEM 13.2需要Oracle 12.1.0.2版本作为 ...

  3. import caffe报错问题

    在搭建好的caffe环境下运行Python报错:ImportError:No module named _caffe 报错原因:由于caffe的Python环境变量未配置好 解决方案: 方法1 imp ...

  4. Unity shader学习之屏幕后期处理效果之高斯模糊

    高斯模糊,见 百度百科. 也使用卷积来实现,每个卷积元素的公式为: 其中б是标准方差,一般取值为1. x和y分别对应当前位置到卷积中心的整数距离. 由于需要对高斯核中的权重进行归一化,即使所有权重相加 ...

  5. 软工网络15团队作业4——Alpha阶段敏捷冲刺4.0

    软工网络15团队作业4--Alpha阶段敏捷冲刺4.0 1.每天举行站立式会议,提供当天站立式会议照片一张. 2.项目每个成员的昨天进展.存在问题.今天安排. 成员 昨天已完成 今天计划完成 郭炜埕 ...

  6. [10]Windows内核情景分析---中断处理

    中断处理 每个cpu有一张中断表,简称IDT. IDT的整体布局:[异常->空白->5系->硬](推荐采用7字口诀的方式重点记忆) 异常:前20个表项存放着各个异常的描述符(IDT表 ...

  7. STL(标准模板库)基本概念

    一.什么是STL STL(Standard Template Library,标准模板库)的从广义上讲分为三类:algorithm(算法).container(容器)和iterator(迭代器),容器 ...

  8. unity3D客户端框架

    unity3D客户端框架  博客

  9. PersistenceContext.properties()

    在做 Spring + SpringMVC + SpringData 时,单元测试 报这个错误: java.lang.NoSuchMethodError:javax.persistence.Persi ...

  10. Spring源码阅读(一)

    Spring通过配置文件或者注解对类实例进行加载管理.稍微思考,可以猜测spring加载过程肯定先把配置转化为统一的配置对象,再把通过配置对象生产类实例.阅读源码,我们也可以发现这个逻辑. sprin ...