题目

也不是很知道为什么这道题要和某\(B\)姓算法扯上关系

首先有一个非常显然基于那个\(B\)姓算法的做法,每次启发式合并\(trie\)即可,复杂度是\(O(n\ logn\ loga_i)\)

这个做法太无脑了,考虑一个高端的做法,只需要\(kruskal\)的思想就够了

我们还是先建出一棵\(trie\),我们考虑我们得到了某个节点左右两个儿子的\(mst\),之后如何合并出整个子树的\(mst\)

看起来就是在扯淡,\(mst\)这个东西显然不是能随随便便合并的东西

但是我们考虑一下这个题的特殊性质,我们左右两个子树的\(mst\)内的边都是小于过这个节点的边的,因为过这个节点的边在这一个比较高的二进制位上异或起来是\(1\)

所以我们连过这个节点的边无论怎么连都不会小于之前两个\(mst\)里的边,所以原来\(mst\)里的边在合并后的新\(mst\)里都是存在的,所以我们只需要在左右两个儿子里找一个最小的异或值加入答案就可以了

找两个\(trie\)对应的最小的异或值,我们显然可以直接暴力比对两个\(trie\),这样下来每个点最多会被暴力到\(loga_i\)次,所以总复杂度是\(O(nlog^2a_i)\)

先染实际上根本跑不满,感觉并没有比一个\(log\)慢多少当然也有可能是我分析错了

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define re register
#define LL long long
#define min std::min
inline int read() {
char c=getchar();
int x=0;
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();
return x;
}
const int maxn=2e5+5;
const LL inf=1e15;
int n,a[maxn],son[maxn*31][2],bit[31],cnt;
inline void ins(int x) {
memset(bit,0,sizeof(bit));
for(re int i=0; i<30; i++)
bit[i]=(x&(1<<i))>0;
int now=1;
for(re int i=29; i>=0; --i) {
if(!son[now][bit[i]]) son[now][bit[i]]=++cnt;
now=son[now][bit[i]];
}
}
LL chk(int x,int y,int w) {
if(!x||!y) return 0;
LL t=inf;
if(son[x][0]&&son[y][0]) t=min(t,chk(son[x][0],son[y][0],w-1));
if(son[x][1]&&son[y][1]) t=min(t,chk(son[x][1],son[y][1],w-1));
if(t==inf) {
if(son[x][1]&&son[y][0]) t=min(t,chk(son[x][1],son[y][0],w-1)),t+=(1<<w);
if(son[x][0]&&son[y][1]) t=min(t,chk(son[x][0],son[y][1],w-1)),t+=(1<<w);
if(t==inf) t=0;
}
return t;
}
LL dfs(int x,int w) {
if(!x||w<0) return 0;
if(son[x][0]&&son[x][1])
return (1<<w)+chk(son[x][0],son[x][1],w-1)+dfs(son[x][0],w-1)+dfs(son[x][1],w-1);
return dfs(son[x][0],w-1)+dfs(son[x][1],w-1);
}
int main() {
n=read();
cnt=1;
for(re int i=1; i<=n; i++) a[i]=read();
std::sort(a+1,a+n+1);n=std::unique(a+1,a+n+1)-a-1;
for(re int i=1; i<=n; i++) ins(a[i]);
printf("%lld\n",dfs(1,29));
return 0;
}

【CF888G】Xor-MST的更多相关文章

  1. 【BZOJ2337】Xor和路径(高斯消元)

    [BZOJ2337]Xor和路径(高斯消元) 题面 BZOJ 题解 我应该多学点套路: 对于xor之类的位运算,要想到每一位拆开算贡献 所以,对于每一位拆开来看 好了,既然是按位来算 我们就只需要计算 ...

  2. 【AtCoder3611】Tree MST(点分治,最小生成树)

    [AtCoder3611]Tree MST(点分治,最小生成树) 题面 AtCoder 洛谷 给定一棵\(n\)个节点的树,现有有一张完全图,两点\(x,y\)之间的边长为\(w[x]+w[y]+di ...

  3. 【AtCoder2134】ZigZag MST(最小生成树)

    [AtCoder2134]ZigZag MST(最小生成树) 题面 洛谷 AtCoder 题解 这题就很鬼畜.. 既然每次连边,连出来的边的权值是递增的,所以拿个线段树xjb维护一下就可以做了.那么意 ...

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

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

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

    [CF888G]Xor-MST(最小生成树,Trie树) 题面 CF 洛谷 题解 利用\(Kruskal\)或者\(Prim\)算法都很不好计算. 然而我们还有一个叫啥来着?\(B\)啥啥的算法,就叫 ...

  6. 【BZOJ2115】Xor(线性基)

    [BZOJ2115]Xor(线性基) 题面 BZOJ Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si ...

  7. 【BZOJ1937】[Shoi2004]Mst 最小生成树 KM算法(线性规划)

    [BZOJ1937][Shoi2004]Mst 最小生成树 Description Input 第一行为N.M,其中 表示顶点的数目, 表示边的数目.顶点的编号为1.2.3.…….N-1.N.接下来的 ...

  8. 【HDU3949】XOR

    [题目大意] 给定一个数组,求这些数组通过异或能得到的数中的第k小是多少. 传送门:http://vjudge.net/problem/HDU-3949 [题解] 首先高斯消元求出线性基,然后将k按照 ...

  9. BZOJ 2115 【Wc2011】 Xor

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

  10. 【BZOJ-2115】Xor 线性基 + DFS

    2115: [Wc2011] Xor Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 2142  Solved: 893[Submit][Status] ...

随机推荐

  1. 使用jQuery函数

    1选择器 1.1说明 选择器本身只是一个有特定语法规则的字符串, 没有实质用处,它的基本语法规则使用的就是CSS的选择器语法, 并对基进行了扩展,只有调用$(), 并将选择器作为参数传入才能起作用. ...

  2. kafka和flume进行整合的日志采集的confi文件编写

    配置flume.conf 为我们的source channel sink起名 a1.sources = r1 a1.channels = c1 a1.sinks = k1 指定我们的source收集到 ...

  3. [NOI.AC] palindrome

    思路: \(50pts\) \(f[l,r]\)表示区间\([l,r]\)能够变成多少个串,转移枚举\(l\),利用\(hash\)判字符串相等. 复杂度\(O(Tn^3)\) \(70pts\) 考 ...

  4. 新版本Mongo4.0 新建用户

    db.createUser( { user: “admin”, pwd: “xxx”, roles: [ { role: “userAdminAnyDatabase”, db: “admin” } ] ...

  5. jQuery 表单域选中选择器

    复选框.单选按钮.下拉列表 /***********************************************/ <script type="text/javascrip ...

  6. Spark 调优之数据倾斜

    什么是数据倾斜? Spark 的计算抽象如下 数据倾斜指的是:并行处理的数据集中,某一部分(如 Spark 或 Kafka 的一个 Partition)的数据显著多于其它部分,从而使得该部分的处理速度 ...

  7. Linux上 安装Sorl4.7 中间件用tomcat

    最近需要用到solr,公司内部搭建了一个solr测试环境. 版本:solr4.7.2 ,tomcat 7.0.55 jdk:1.7_051 解压 solr 和tomcat  这里就不详说. 1.启动t ...

  8. Spark DataFrame中的join使用说明

    spark sql 中join的类型 Spark DataFrame中join与SQL很像,都有inner join, left join, right join, full join; 类型 说明 ...

  9. 细数Intellij Idea10个蛋疼问题!

    Intellij Idea以下简称IJ. 昨天细数了IJ上的10大666的姿势,IJ确实很智能,在很多方便可以完爆Eclipes,可在某些方面真的被Eclipse秒杀 1.乱码 在Eclipse中很少 ...

  10. <后端>Flask框架

    1.Flask框架安装 简介:轻量级WEB框架,类似于简单版本的Django pip install flask 环境文件生成 pip freeze > requirement.txt 环境文件 ...