【CF888G】Xor-MST
也不是很知道为什么这道题要和某\(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的更多相关文章
- 【BZOJ2337】Xor和路径(高斯消元)
[BZOJ2337]Xor和路径(高斯消元) 题面 BZOJ 题解 我应该多学点套路: 对于xor之类的位运算,要想到每一位拆开算贡献 所以,对于每一位拆开来看 好了,既然是按位来算 我们就只需要计算 ...
- 【AtCoder3611】Tree MST(点分治,最小生成树)
[AtCoder3611]Tree MST(点分治,最小生成树) 题面 AtCoder 洛谷 给定一棵\(n\)个节点的树,现有有一张完全图,两点\(x,y\)之间的边长为\(w[x]+w[y]+di ...
- 【AtCoder2134】ZigZag MST(最小生成树)
[AtCoder2134]ZigZag MST(最小生成树) 题面 洛谷 AtCoder 题解 这题就很鬼畜.. 既然每次连边,连出来的边的权值是递增的,所以拿个线段树xjb维护一下就可以做了.那么意 ...
- 【CF888G】Xor-MST Trie树(模拟最小生成树)
[CF888G]Xor-MST 题意:给你一张n个点的完全图,每个点有一个权值ai,i到j的边权使ai^aj,求这张图的最小生成树. n<=200000,ai<2^30 题解:学到了求最小 ...
- 【CF888G】Xor-MST(最小生成树,Trie树)
[CF888G]Xor-MST(最小生成树,Trie树) 题面 CF 洛谷 题解 利用\(Kruskal\)或者\(Prim\)算法都很不好计算. 然而我们还有一个叫啥来着?\(B\)啥啥的算法,就叫 ...
- 【BZOJ2115】Xor(线性基)
[BZOJ2115]Xor(线性基) 题面 BZOJ Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si ...
- 【BZOJ1937】[Shoi2004]Mst 最小生成树 KM算法(线性规划)
[BZOJ1937][Shoi2004]Mst 最小生成树 Description Input 第一行为N.M,其中 表示顶点的数目, 表示边的数目.顶点的编号为1.2.3.…….N-1.N.接下来的 ...
- 【HDU3949】XOR
[题目大意] 给定一个数组,求这些数组通过异或能得到的数中的第k小是多少. 传送门:http://vjudge.net/problem/HDU-3949 [题解] 首先高斯消元求出线性基,然后将k按照 ...
- BZOJ 2115 【Wc2011】 Xor
Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 ...
- 【BZOJ-2115】Xor 线性基 + DFS
2115: [Wc2011] Xor Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 2142 Solved: 893[Submit][Status] ...
随机推荐
- 打造“云边一体化”,时序时空数据库TSDB技术原理深度解密
本文选自云栖大会下一代云数据库分析专场讲师自修的演讲——<TSDB云边一体化时序时空数据库技术揭秘> 自修 —— 阿里云智能数据库产品事业部高级专家 认识TSDB 第一代时序时空数据处理工 ...
- NX二次开发-UFUN设置对象线型UF_OBJ_set_font
#include <uf.h> #include <uf_modl.h> #include <uf_obj.h> UF_initialize(); //创建块 UF ...
- linux下mysql权限配置
先登入mysql mysql -u root -p 然后回车键入密码! 1.2 赋予主机B操作数据库的权限 mysql> grant usage on *.* to username@192.1 ...
- sql中desc的妙用
很多情况下对表内部结构不熟悉,想看下我创建的表里面又多少表明,又想他按照首字母的规律排列, 这时候就要用desc +表名了. desc t_bike_info; hive> desc t_bik ...
- 阿里云ecs(phpstudy一件包)
选择语言 保存并连接 Linux硬盘挂载是比较常见的管理操作之一.默认情况下数据盘没有挂载,需要手动挂载到系统中. 具体操作是分三步: 硬盘挂载1)需 ...
- NetBeans简介和简单使用
1.什么是NetBeans? NetBeans IDE:可以使开发人员利用Java平台能够快速创建Web.企业.桌面以及移动的应用程序: 支持语言:PHP.Ruby.JavaScript.Groovy ...
- Instrumentation 实践详解
原文地址:https://blog.csdn.net/pengjunlee/article/details/72717622
- HDU-1850-Being a Good Boy in Spring Festival-nim博弈
一年在外 父母时刻牵挂春节回家 你能做几天好孩子吗寒假里尝试做做下面的事情吧 陪妈妈逛一次菜场悄悄给爸爸买个小礼物主动地 强烈地 要求洗一次碗某一天早起 给爸妈用心地做回早餐 如果愿意 你还可以和爸妈 ...
- 打包的@font-face包
在网页中使用 @font-face 规则嵌入字体,前提是可以从你的网站或第三方 Web 服务器下载到相应的字体.以这种方式提供的字体,会在使用该字体的页面第一次加载时被浏览器下载并缓存起来,以后就不用 ...
- Neo4j使用简单例子
Neo4j Versions Most of the examples on this page are written with Neo4j 2.0 in mind, so they skip th ...